0

バックグラウンド スレッドで実行したいコードの一部がある場合、.NET (C#)これを実現する最も簡単な方法は何ですか?

例えば。

myObject1.myFunction(10, "Test");
myObject2.myFunction(20, "Test");
myObject3.myFunction(30, "Test");

上記のコードをバックグラウンド スレッドで実行する最も簡単な方法は何でしょうか?

4

5 に答える 5

2

4.0以降の.NETバージョンを使用している場合、これが最短の方法だと思います:

Task.Factory.StartNew(() => 
{
   myObject1.myFunction(10, "Test");
   myObject2.myFunction(20, "Test");
   myObject3.myFunction(30, "Test"); 
})

詳細: http://msdn.microsoft.com/en-us/library/dd321439.aspx

Jeroen は、このタスクに Thread.Start を使用することを提案しましたが、これは少し短いですが、Skeetによると、Task でプレーンな Thread を使用すると、これらのものが失われます。

タスクは、タスク API のすべての利点を提供します。

  • 継続の追加 (Task.ContinueWith)
  • 複数のタスクが完了するのを待機中 (すべてまたはいずれか)
  • タスクのエラーを捕捉し、後で調査する
  • キャンセルのキャプチャ (および、最初にキャンセルを指定できるようにする)
  • 潜在的に戻り値を持つ
  • C# 5 で await を使用する
  • スケジューリングのより良い制御 (長時間実行される場合は、タスク スケジューラがそれを考慮に入れることができるように、タスクを作成するときにそう言ってください)
于 2013-10-01T05:20:48.807 に答える
1

Giedrius が言ったように、.NET 4.0 以降を使用している場合は、TPL ライブラリが最適です。ContinueWith と task.IsFaulted を使用して、未処理の例外が原因でスレッドが失敗したかどうかを完了時に確認することをお勧めします。

Task.Factory.StartNew(() => 
{
    myObject1.myFunction(10, "Test");
    myObject2.myFunction(20, "Test");
    myObject3.myFunction(30, "Test"); 
}).ContinueWith(task => {
        if(task.IsFaulted)
        {
            AggregateException ex = task.Exception;
            //handle exception
        }
    });

于 2013-10-01T06:01:31.873 に答える
1

おそらくこれを行う簡単な方法は、バックグラウンド ワーカーを使用することです。

class Program
{
  static BackgroundWorker _bw = new BackgroundWorker();

  static void Main()
  {
    _bw.DoWork += bw_DoWork;
    _bw.RunWorkerAsync ();
    Console.ReadLine();
  }

  static void bw_DoWork (object sender, DoWorkEventArgs e)
  {
    myObject1.myFunction(10, "Test");
    myObject2.myFunction(20, "Test");
    myObject3.myFunction(30, "Test");
  }
}
于 2013-10-01T05:20:30.290 に答える
1

私はこれを使用します:

new Thread( () =>
{
    myObject1.myFunction(10, "Test");
    myObject2.myFunction(20, "Test");
    myObject3.myFunction(30, "Test");
}).Start();

これは、.NET バージョン 4.5、4、3.5、3.0、2.0 で動作します。

于 2013-10-01T05:20:44.613 に答える
0

匿名デリゲートを使用してラップします。

ThreadPool.QueueUserWorkItem(delegate(object state) {

    // extract parameters from the object
    object[] array = state as object[];

    // your code here
    myObject1.myFunction(array[0], "Test");
    myObject2.myFunction(array[1], "Test");
    myObject3.myFunction(array[2], "Test");

}, 

// pass parameters as object
new object[] { 10, 20, 30 }

);

詳細情報: http://msdn.microsoft.com/en-us/library/3dasc8as(v=vs.100).aspx

于 2013-10-01T05:27:53.640 に答える