2

マルチスレッドまたは非同期スレッドの例をどこで入手できるか知りたいです。

忙しいアプリケーションでは、アプリケーションのバックグラウンドでスレッドを実行して、変化する値をフェッチする必要があります。そして、この値が一定量に達するたびに、別の関数を呼び出す必要があります。ユーザーがアプリケーションで他のことを実行できるように、これらすべてをプログラムのバックグラウンドで実行する必要があります。

役立つ例やリンクをいただければ幸いです。

4

4 に答える 4

2

オプションを要約するために、ここにそれらをリストしようとします (これをコミュニティ 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の答えから恥知らずに盗まれました):

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

あなたが求める制御のレベルに応じて、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

于 2013-05-02T07:07:37.073 に答える
1

.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!"; 
            }));
    });
于 2013-05-02T07:31:22.217 に答える