web-dev-qa-db-ja.com

スレッディング:c#にはJava Runnableインターフェースと同等のものがありますか?

C#にはJava Runnableインターフェースと同等のものがありますか?

そうでない場合、これはどのように実装できますか、それとも単に必要ありませんか?

ありがとう。

36
DiggerMeUp

いいえ。 C#はスレッドをJavaとは異なる方法で処理します。 Threadクラスをサブクラス化するのではなく、新しいSystem.Threading.Threadオブジェクトを作成し、それにThreadStartデリゲートを渡します(これが作業を行う関数です)。

29
Fergal Moran

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
OscarRyz

ThreadStart delegate は、基本的にRunnableインターフェースと同じです。デリゲートは、クラス全体ではなく単一のメソッドのインターフェースのようなものなので、JavaのRunnableインターフェースよりも実装が簡単です。

MSDN デリゲートについて説明

デリゲートとインターフェイスは、仕様と実装を分離できるという点で似ています。複数の独立した作成者が、インターフェース仕様と互換性のある実装を作成できます。同様に、デリゲートはメソッドのシグネチャを指定し、作成者はデリゲート仕様と互換性のあるメソッドを作成できます。いつインターフェイスを使用し、いつデリゲートを使用する必要がありますか?

デリゲートは次の場合に役立ちます。

  • 単一のメソッドが呼び出されています。
  • クラスは、メソッド仕様の複数の実装を必要とする場合があります。
  • 静的メソッドを使用して仕様を実装できるようにすることが望ましい。
  • イベントのようなデザインパターンが望ましい(詳細については、イベントチュートリアルを参照)。
  • 呼び出し元は、メソッドが定義されているオブジェクトを認識したり取得したりする必要はありません。
  • 実装のプロバイダーは、仕様の実装をいくつかの選択されたコンポーネントのみに「配布」したいと考えています。
  • 簡単な構成が望まれます。

インターフェイスは次の場合に役立ちます。

  • この仕様では、呼び出される一連の関連メソッドが定義されています。
  • クラスは通常、仕様を1回だけ実装します。
  • インターフェイスの呼び出し元は、他のインターフェイスまたはクラスを取得するために、インターフェイスタイプにキャストしたり、インターフェイスタイプからキャストしたりします。
14
Daniel Pryden

C#は、JavaのThreadStartスタイルの代わりに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
Dave Sims

必要ありません。C#のスレッドは、実行するスレッドの実行可能コンポーネントであるThreadStartまたはParameterizedThreadStartデリゲートのインスタンスを取得します。

4
Lee

高レベルのタスク指向のスレッド化APIに最も近いのは BackgroundWorker です。他の人が述べたように、.NET(およびC#)は呼び出し可能なメソッドを表すためにデリゲートを使用します。 Javaにはその概念(関数ポインター)がなく、代わりに呼び出し可能なオブジェクトのインターフェースを使用します。

4
Sam Harwell

.NetはThreadStartおよびParameterizedThreadStartデリゲートをbootstrap Threads。

デリゲートは.Netの第一級市民であるため、必要に応じて参照を維持できます。

3
Florian Doyon