Поточная обработка: c# имеет эквивалент интерфейса Java Runnable?

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

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

спасибо.

35
задан DiggerMeUp 17 December 2009 в 17:58
поделиться

7 ответов

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

28
ответ дан 27 November 2019 в 06:29
поделиться

Имеется ли в C # эквивалент интерфейса 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.");
      }
  }
54
ответ дан 27 November 2019 в 06:29
поделиться

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

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

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

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

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

Интерфейсы полезны, когда:

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

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's Runnable)
        Thread thread = new Thread(new ThreadStart(foo.DoStuff));
        thread.Start();
    }
}
6
ответ дан 27 November 2019 в 06:29
поделиться

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

4
ответ дан 27 November 2019 в 06:29
поделиться

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

4
ответ дан 27 November 2019 в 06:29
поделиться

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

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

3
ответ дан 27 November 2019 в 06:29
поделиться