【问题标题】:Threading: does c# have an equivalent of the Java Runnable interface?线程:c# 是否具有 Java Runnable 接口的等价物?
【发布时间】:2009-12-17 17:58:59
【问题描述】:

c# 是否有与 Java Runnable 接口等效的接口?

如果不是,如何实现或者根本不需要?

谢谢。

【问题讨论】:

  • 非常感谢所有回答这个惊人回复的人。

标签: c# java interface multithreading


【解决方案1】:

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.");
      }
  }

【讨论】:

  • 截至 2015 年 9 月 25 日,这还没有为 Xamarin 实现,所以你不得不使用 Frankenstein C#/Java 选项来完成与这个答案相同的事情。
【解决方案2】:

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

MSDNexplains about delegates:

委托和接口是相似的 因为它们能够分离 规范和实施。 多个独立作者可以 产生的实现是 与接口兼容 规格。同样,委托 指定方法的签名, 并且作者可以编写方法 与代表兼容 规格。你应该什么时候使用 接口,什么时候应该使用 代表?

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

  • 正在调用一个方法。
  • 一个类可能需要方法的多个实现 规范。
  • 最好允许使用静态方法来实现 规范。
  • 需要类似事件的设计模式(有关详细信息,请参阅 活动教程)。
  • 调用者无需知道或获取该方法的对象 定义于。
  • 实现的提供者想要“分发” 规范的实施 只有少数选定的组件。
  • 需要简单的构图。

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

  • 规范定义了一组相关的方法 调用。
  • 一个类通常只实现一次规范。
  • 接口的调用者想要转换到接口或从接口转换 键入以获取其他接口或 类。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 旁注:在 Java 中,Runnable 接口是子类化Thread 的替代方法,但您仍然必须创建一个新的Thread 对象,将Runnable 传递给构造函数。
    • 所以基本上,ThreadStart 完全等同于 Java 的 Runnable 的 C#。
    • @Michel Borgwardt:是的,答案是正确的(本质上),但它的写法是错误的。
    • Runnable 与线程无关。人们使用它的方式与线程有很大关系。
    • Runnable 本身与线程无关。人们使用它的方式与线程有很大关系。 Runnable 是一个定义 void run 方法的接口。 Runnable 没有什么需要涉及线程的。例如,您可以在一个对象上拥有一组观察者,这些观察者只不过是 Runnable,每次观察者需要调用时都会调用它们的 run() 方法。我知道这可能看起来有点做作,但对于大量用例来说,这正是您所需要的。
    【解决方案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's Runnable)
            Thread thread = new Thread(new ThreadStart(foo.DoStuff));
            thread.Start();
        }
    }
    

    【讨论】:

      【解决方案5】:

      这不是必需的 - C# 中的线程采用 ThreadStartParameterizedThreadStart 委托的实例,它们是要执行的线程的可运行组件。

      【讨论】:

        【解决方案6】:

        最接近高级面向任务的线程 API 是BackgroundWorker。正如其他人所提到的,.NET(以及 C#)使用委托来表示可调用的方法。 Java 没有这个概念(函数指针),而是使用可调用对象的接口。

        【讨论】:

          【解决方案7】:

          .Net 使用 ThreadStartParameterizedThreadStart 委托来引导线程。

          代表是 .Net 中的一等公民,如果需要,您可以保留参考。

          【讨论】:

            猜你喜欢
            • 2022-09-23
            • 2012-08-10
            • 2020-09-20
            • 2012-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多