Подтвердить что ты не робот

Threading: имеет ли С# эквивалент интерфейса Java Runnable?

Имеет ли С# эквивалент интерфейса Java Runnable?

Если не так, как это можно реализовать или просто не нужно?

спасибо.

4b9b3361

Ответ 1

Неа. С# обрабатывает потоки по-разному с Java. Вместо подкласса класса Thread вы просто создаете новый объект System.Threading.Thread и передаете ему делегат ThreadStart (это функция, где вы выполняете работу).

Ответ 2

Имеет ли С# эквивалент интерфейса 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.");
      }
  }

Ответ 3

ThreadStart delegate по существу совпадает с интерфейсом Runnable. Делегат подобен интерфейсу для одного метода, а не для всего класса, поэтому его проще реализовать, чем интерфейс Runnable в Java.

MSDN объясняет о делегатах:

Делегаты и интерфейсы аналогичны в том смысле, что они позволяют спецификации и реализации. Несколько независимых авторов могут производить реализации, которые совместимый с интерфейсом Спецификация. Точно так же делегат определяет подпись метода, и авторы могут писать методы, которые совместимый с делегатом Спецификация. Когда вы должны использовать интерфейсов, и когда вы должны использовать делегаты?

Делегаты полезны, когда:

  • Вызывается один метод.
  • Класс может захотеть иметь несколько реализаций метода спецификация.
  • Желательно разрешить использование статического метода для реализации спецификация.
  • Желателен шаблон, подобный событию (для получения дополнительной информации см. Events).
  • У вызывающего нет необходимости знать или получать объект, что метод определяется на.
  • Поставщик реализации хочет "раздавать" реализации спецификации всего несколько компонентов.
  • Желательна легкая композиция.

Интерфейсы полезны, если:

  • Спецификация определяет набор связанных методов, которые будут называется.
  • Класс обычно реализует спецификацию только один раз.
  • Вызывающий интерфейс хочет передать в интерфейс или из него тип для получения других интерфейсов или классы.

Ответ 4

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();
    }
}

Ответ 5

Не нужно - потоки в С# принимают экземпляр делегата ThreadStart или ParameterizedThreadStart, которые являются исполняемыми компонентами выполняемого потока.

Ответ 6

Ближайшим к высокоуровневому API-интерфейсу Threading-Threading будет BackgroundWorker. Как отмечали другие,.NET(и, следовательно, С#) используют делегаты для представления метода вызова. Java не имеет этой концепции (указатели функций) и вместо этого использует интерфейсы для вызываемых объектов.

Ответ 7

.Net использует делегаты ThreadStart и ParameterizedThreadStart для загрузочных потоков.

Делегаты, являющиеся первоклассными гражданами в .Net, вы можете оставить ссылку, если вам нужно.