マルチスレッドまたは非同期スレッドの例をどこで入手できるか知りたいです。
忙しいアプリケーションでは、アプリケーションのバックグラウンドでスレッドを実行して、変化する値をフェッチする必要があります。そして、この値が一定量に達するたびに、別の関数を呼び出す必要があります。ユーザーがアプリケーションで他のことを実行できるように、これらすべてをプログラムのバックグラウンドで実行する必要があります。
役立つ例やリンクをいただければ幸いです。
マルチスレッドまたは非同期スレッドの例をどこで入手できるか知りたいです。
忙しいアプリケーションでは、アプリケーションのバックグラウンドでスレッドを実行して、変化する値をフェッチする必要があります。そして、この値が一定量に達するたびに、別の関数を呼び出す必要があります。ユーザーがアプリケーションで他のことを実行できるように、これらすべてをプログラムのバックグラウンドで実行する必要があります。
役立つ例やリンクをいただければ幸いです。
オプションを要約するために、ここにそれらをリストしようとします (これをコミュニティ wiki にするのは良い考えかもしれません)。
まず、別のスレッドで関数を簡単に開始できます。
Thread t = new Thread( ThreadProc );
t.Start();
// now you can wait for thread to finish with t.Join() or just continue
// Thread.IsBackground allows to control how thread lifetime influences
// the lifetime of the application
...
static void ThreadProc() {...} // can also be non-static, but for simplicity....
次に、次を使用できますBackgroundWorker
。
BackgroundWorker bgWorker = new BackgroundWorker();
bgWorker.DoWork += MyFunction;
bgWorker.RunWorkerAsync();
voud MyFunction(object o, DoWorkEventArgs args) {...}
ProgressChanged
およびイベントを使用して、より多くの制御を行うことができます(およびその他のプロパティRunWorkerCompleted
も同様)。WorkerReportsProgress
ThreadPool
メソッドにあまり時間がかからない場合は、別のオプションを使用することもできます。
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
...
static void ThreadProc(Object stateInfo) { ... }
さらに別のオプションはBeginInvoke
、デリゲートを呼び出すことです:
public delegate int MyDelegate(...);
MyDelegate del = SomeFunction;
IAsyncResult ar = del.BeginInvoke(...);
int result = del.EndInvoke(ar);
これは、スレッド プールのスレッドで実行されます。スレッドの呼び出しを待機する必要がある場合は、を使用できますがIAsyncResult.IsCompleted
、呼び出しスレッドがブロックされます。
そしてもちろん、次を使用できますTask
。
var task = Task.Factory.StartNew(() => MyMethod());
MyMethod
これはスレッド プールのスレッドでも実行されるため、同じ警告が適用されます (ただしTaskCreationOptions.LongRunning
、新しいスレッドが常に作成されるようにするために を使用できます)。状況によっては (タスクを待機している場合)、同じスレッドで実行することもできますが、十分に最適化されているため、心配する必要はありません。
これはおそらく、シンプルさとコントロールの最適なトレードオフを備えたオプションです (もちろん、本当に「最高」というものはありません)。利点は次のとおりです( Jon Skeetの答えから恥知らずに盗まれました):
あなたが求める制御のレベルに応じて、BackgroundWorker
は簡単に機能し、 内で見つかりますSystem.ComponentModel.BackgroundWorker
。ここに、主題に関する MSDN ドキュメントへのリンクがあります: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
シンプルなユースケースのシナリオは次のようになります。
BackgrouWorker BG = new BackgroudWorker();
GB.DoWork += YourFunctionDelegate(object Sender, EventArgs e);
GB.RunWorkerAsync();
これYourFunctionDelegate(object Sender,EventArgs e)
で、バックグラウンドで実行したいことは何でもあるはずです。ただし、この引数形式に従う必要があります。バックグラウンドワーカーのようなイベントに関連付けられたヘルパー関数もかなりありますonProgressChanged
。これにより、明らかに進行状況を監視できます。これは、スレッド化に慣れていない場合、作成しようとすると最初は苦痛であることが判明する可能性があります。あなた自身のスレッド。
実行とスレッドの機能をより詳細に制御したい場合は、Task-Parallel-Libraryを参照してください: http://msdn.microsoft.com/en-us/library/dd460717.aspxマルチスレッドに関する情報の。
また、C# スレッドの作成方法に関する優れたチュートリアルもここにあります: http://support.microsoft.com/default.aspx?scid=kb;en-us;815804
.Net 4.5 での Windows 8 での非同期プログラミングの概要については、次を参照してください。
http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
.Net 4.0 以前の場合、ThreadPool を使用できます
System.Threading.ThreadPool.QueueUserWorkItem(obj =>
{
// Do some work
for (int i = 0; i < 1000; i++)
Math.Sin(i);
// Get back to the UI thread
App.Current.MainWindow.Dispatcher.BeginInvoke(
new Action(delegate
{
block.Text = "Done!";
}));
});