C# ha un equivalente dell'interfaccia Runnable Java?Threading: C# ha un equivalente dell'interfaccia Runnable Java?
In caso contrario, come è possibile implementarlo o semplicemente non è necessario?
grazie.
C# ha un equivalente dell'interfaccia Runnable Java?Threading: C# ha un equivalente dell'interfaccia Runnable Java?
In caso contrario, come è possibile implementarlo o semplicemente non è necessario?
grazie.
No. C# gestisce i thread in modo diverso da Java. Invece di sottoclasse la classe Thread, devi semplicemente creare un nuovo oggetto System.Threading.Thread e passarlo a un delegato ThreadStart (questa è la funzione in cui lavori) ..
Nota a margine: in Java, l'interfaccia 'Runnable' è un'alternativa alla sottoclasse di' Thread', ma devi comunque creare un nuovo oggetto 'Thread', passando il' Runnable' a un costruttore. – Powerlord
Fondamentalmente, ThreadStart * è * l'esatto C# equivalente a Runnable di Java. –
@ Michel Borgwardt: Yeap, la risposta è corretta (in sostanza) ma sbagliata nel modo in cui è scritta. – OscarRyz
Non è necessario - i thread in C# prendono un istanza di un delegato o ParameterizedThreadStart
che sono i componenti eseguibili del thread da eseguire.
.Net utilizza i delegati ThreadStart
e ParameterizedThreadStart
per avviare i thread.
I delegati sono cittadini di prima classe in .Net, è possibile mantenere un riferimento in giro se necessario.
Il più vicino a un'API di threading orientata all'attività di alto livello sarebbe un BackgroundWorker
. Come altri hanno menzionato, .NET (e quindi C#) usa delegati per rappresentare un metodo callable. Java non ha questo concetto (puntatori di funzione) e utilizza invece interfacce per gli oggetti chiamabili.
Lo ThreadStart
delegate è essenzialmente uguale all'interfaccia Runnable
. Un delegato è come un'interfaccia per un singolo metodo piuttosto che un'intera classe, quindi è in realtà più semplice da implementare rispetto all'interfaccia Runnable
in Java.
MSDN explains about delegates:
delegati e le interfacce sono simili in quanto consentono la separazione di specifica e implementazione. Gli autori indipendenti multipli possono produrre implementazioni compatibili con un'interfaccia . Analogamente, un delegato specifica la firma di un metodo, e gli autori possono scrivere metodi che sono compatibili con la specifica del delegato . Quando è necessario utilizzare le interfacce e quando utilizzare i delegati ?
delegati sono utili quando:
- Un unico metodo viene chiamato.
- Una classe potrebbe voler disporre di più implementazioni della specifica del metodo .
- È consigliabile consentire l'utilizzo di un metodo statico per implementare la specifica .
- Si desidera un motivo di progettazione di tipo evento (per ulteriori informazioni, consultare l'Esercitazione sugli eventi ).
- Il chiamante non ha bisogno di conoscere o ottenere l'oggetto in cui è definito il metodo .
- Il fornitore dell'implementazione desidera "distribuire" l'implementazione della specifica allo solo alcuni componenti di selezione.
- È richiesta una composizione facile.
interfacce sono utili quando:
- La specifica definisce un insieme di metodi correlati che saranno chiamati .
- Una classe di solito implementa la specifica solo una volta.
- Il chiamante dell'interfaccia desidera eseguire il cast da o verso l'interfaccia per ottenere altre interfacce o classi .
C#
utilizza il delegato ThreadStart
invece dello stile di Java Runnable
.
public class Foo
{
public void DoStuff()
{
while (true)
{
// do some stuff
}
}
};
public class Bar
{
public static int Main()
{
Foo foo = new Foo();
// create a ThreadStart delegate and pass in the method that will run
// (similar to run on Java's Runnable)
Thread thread = new Thread(new ThreadStart(foo.DoStuff));
thread.Start();
}
}
Fa C# hanno un equivalente dell'interfaccia Runnable Java?
Sì, è ThreadStart
class Runner
{
void SomeMethod()
{
Thread newThread = new Thread(new ThreadStart(Run));
newThread.Start();
}
public void Run()
{
Console.WriteLine("Running in a different thread.")
}
}
sarebbe equivalente al seguente codice Java
class Runner implements Runnable {
void someMethod() {
Thread newThread = new Thread(this);
newThread.start();
}
public void run() {
out.println("Running in a different thread.");
}
}
A partire dal 2015-09-25 questo deve ancora essere implementato per Xamarin, quindi sei bloccato con le opzioni di Frankenstein C#/Java per ottenere lo stesso risultato di questa risposta. – codeMonkey
Un grande grazie a tutti coloro che hanno risposto questa risposta straordinaria. – DiggerMeUp