Потоки: у c # есть эквивалент Java Runnable интерфейса? - PullRequest
35 голосов
/ 17 декабря 2009

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

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

спасибо.

Ответы [ 7 ]

53 голосов
/ 17 декабря 2009

Имеет ли 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.");
      }
  }
29 голосов
/ 17 декабря 2009

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

14 голосов
/ 17 декабря 2009

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

MSDN рассказывает о делегатах :

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

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

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

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

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

C# использует делегат ThreadStart вместо стиля Runnable Java.

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();
    }
}
4 голосов
/ 17 декабря 2009

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

4 голосов
/ 17 декабря 2009

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

3 голосов
/ 17 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...