バックグラウンド スレッドで実行したいコードの一部がある場合、.NET (C#)
これを実現する最も簡単な方法は何ですか?
例えば。
myObject1.myFunction(10, "Test");
myObject2.myFunction(20, "Test");
myObject3.myFunction(30, "Test");
上記のコードをバックグラウンド スレッドで実行する最も簡単な方法は何でしょうか?
バックグラウンド スレッドで実行したいコードの一部がある場合、.NET (C#)
これを実現する最も簡単な方法は何ですか?
例えば。
myObject1.myFunction(10, "Test");
myObject2.myFunction(20, "Test");
myObject3.myFunction(30, "Test");
上記のコードをバックグラウンド スレッドで実行する最も簡単な方法は何でしょうか?
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 を使用する
- スケジューリングのより良い制御 (長時間実行される場合は、タスク スケジューラがそれを考慮に入れることができるように、タスクを作成するときにそう言ってください)
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
}
});
おそらくこれを行う簡単な方法は、バックグラウンド ワーカーを使用することです。
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");
}
}
私はこれを使用します:
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 で動作します。
匿名デリゲートを使用してラップします。
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