线程化:c#是否具有Java Runnable接口的等价物?

Dig*_*eUp 35 c# java multithreading interface

c#是否具有Java Runnable接口的等价物?

如果不是如何实施或根本不需要?

谢谢.

Osc*_*Ryz 54

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.")
     }
}
Run Code Online (Sandbox Code Playgroud)

等同于以下Java代码

 class Runner implements Runnable {

     void someMethod() {
        Thread newThread = new Thread( this );
        newThread.start(); 
      }

      public void run() {
          out.println("Running in a different thread.");
      }
  }
Run Code Online (Sandbox Code Playgroud)


Fer*_*ran 28

不.C#以不同于Java的方式处理线程.您只需创建一个新的System.Threading.Thread对象并将其传递给ThreadStart委托(这是您执行工作的函数),而不是继承Thread类.

  • 所以基本上,ThreadStart*是与Java的Runnable相当的C#. (6认同)
  • 旁注:在Java中,`Runnable`接口是子类化`Thread`的替代方法,但你仍然需要创建一个新的`Thread`对象,将`Runnable`传递给构造函数. (5认同)
  • Runnable 本身与线程无关。人们使用它的方式与线程有很大关系。Runnable 是一个定义 void run 方法的接口。Runnable 不需要涉及线程。例如,您可以在一个对象上设置一组观察者,这些观察者只不过是 Runnables,每次观察者需要调用时都会调用它们的 run() 方法。我知道这可能看起来有点做作,但对于大量用例,这正是您所需要的。 (4认同)
  • Runnable 与线程无关。人们使用它的方式与线程有很大关系。 (2认同)

Dan*_*den 14

ThreadStart委托是基本相同的Runnable接口.委托就像是单个方法而不是整个类的Runnable接口,因此它实际上比Java中的接口更容易实现.

MSDN 解释了代表们:

代理和接口类似,因为它们实现了规范和实现的分离.多个独立作者可以生成与接口规范兼容的实现.类似地,委托指定方法的签名,作者可以编写与委托规范兼容的方法.什么时候应该使用接口,什么时候应该使用委托?

代表在以下情况下很有用:

  • 正在调用一种方法.
  • 类可能希望具有方法规范的多个实现.
  • 期望允许使用静态方法来实现规范.
  • 需要类似事件的设计模式(有关更多信息,请参阅"事件教程").
  • 调用者无需知道或获取定义该方法的对象.
  • 实现的提供者希望将规范的实现"分发"给仅少数选择的组件.
  • 需要容易的组合物.

接口在以下情况下很有用:

  • 规范定义了一组将被调用的相关方法.
  • 类通常只实现一次规范.
  • 接口的调用者想要转换为接口类型或从接口类型转换为获取其他接口或类.


Dav*_*ims 6

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();
    }
}
Run Code Online (Sandbox Code Playgroud)