Имеет ли С# эквивалент интерфейса Java Runnable?
Если не так, как это можно реализовать или просто не нужно?
спасибо.
Имеет ли С# эквивалент интерфейса Java Runnable?
Если не так, как это можно реализовать или просто не нужно?
спасибо.
Неа. С# обрабатывает потоки по-разному с Java. Вместо подкласса класса Thread вы просто создаете новый объект System.Threading.Thread и передаете ему делегат ThreadStart (это функция, где вы выполняете работу).
Имеет ли С# эквивалент интерфейса Java Runnable?
Да, это ThreadStart
class Runner
{
void SomeMethod()
{
Thread newThread = new Thread(new ThreadStart(Run));
newThread.Start();
}
public void Run()
{
Console.WriteLine("Running in a different thread.")
}
}
Будет эквивалентен следующий код Java
class Runner implements Runnable {
void someMethod() {
Thread newThread = new Thread( this );
newThread.start();
}
public void run() {
out.println("Running in a different thread.");
}
}
ThreadStart
delegate по существу совпадает с интерфейсом Runnable
. Делегат подобен интерфейсу для одного метода, а не для всего класса, поэтому его проще реализовать, чем интерфейс Runnable
в Java.
MSDN объясняет о делегатах:
Делегаты и интерфейсы аналогичны в том смысле, что они позволяют спецификации и реализации. Несколько независимых авторов могут производить реализации, которые совместимый с интерфейсом Спецификация. Точно так же делегат определяет подпись метода, и авторы могут писать методы, которые совместимый с делегатом Спецификация. Когда вы должны использовать интерфейсов, и когда вы должны использовать делегаты?
Делегаты полезны, когда:
- Вызывается один метод.
- Класс может захотеть иметь несколько реализаций метода спецификация.
- Желательно разрешить использование статического метода для реализации спецификация.
- Желателен шаблон, подобный событию (для получения дополнительной информации см. Events).
- У вызывающего нет необходимости знать или получать объект, что метод определяется на.
- Поставщик реализации хочет "раздавать" реализации спецификации всего несколько компонентов.
- Желательна легкая композиция.
Интерфейсы полезны, если:
- Спецификация определяет набор связанных методов, которые будут называется.
- Класс обычно реализует спецификацию только один раз.
- Вызывающий интерфейс хочет передать в интерфейс или из него тип для получения других интерфейсов или классы.
C#
использует делегат ThreadStart
вместо стиля 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 Runnable)
Thread thread = new Thread(new ThreadStart(foo.DoStuff));
thread.Start();
}
}
Не нужно - потоки в С# принимают экземпляр делегата ThreadStart
или ParameterizedThreadStart
, которые являются исполняемыми компонентами выполняемого потока.
Ближайшим к высокоуровневому API-интерфейсу Threading-Threading будет BackgroundWorker
. Как отмечали другие,.NET(и, следовательно, С#) используют делегаты для представления метода вызова. Java не имеет этой концепции (указатели функций) и вместо этого использует интерфейсы для вызываемых объектов.
.Net использует делегаты ThreadStart
и ParameterizedThreadStart
для загрузочных потоков.
Делегаты, являющиеся первоклассными гражданами в .Net, вы можете оставить ссылку, если вам нужно.