2012-03-01 5 views
0

私は常に10msごとに入力を受け取り、Queue<T>にデータを追加し、別のスレッドがデキューして処理を行い、すべてがうまく流れ続けるようにファイルに書き込むメソッドを持っているとします。これは、処理に10ms以上かかるためです。タイムクリティカルな処理にasync/awaitとTaskを使用する違いは何ですか?

このメソッドを.Net 4で更新するには、新しいスレッドが作成されるように長期実行オプションで新しいタスクを開始します。 BlockingCollection<T>にデータを追加するにはBlockingCollectionGetConsumingEnumerableを呼び出してデータを処理し、これをファイルに書き込みます。

まず、新しいスレッドを作成するためにタスクが必要かどうかは私には分かりませんが、私の無知のために、これは最も有益な方法です。データが入ってきたときに、処理を行い、その後、await FileStream.WriteAsyncを呼び出すasyncでマークされたメソッドを呼び出すように私はおそらく、再びこれを書き換えることができasyncawaitキーワードの導入により、第二に

。これにより、10ms離れたところから来るデータが正常に処理され、バックログがないことが保証されますか?私は、これらの新しいキーワードが新しいスレッドを作成するのではなく、何らかの形でタイムリーに実行を処理することを発見しました。

私のシナリオでは、これは私にとって良いことでしょうか、長時間実行されているタスクとBlockingCollectionで新しいスレッドを作成することに固執すべきですか?

+0

あなたの質問は不明です - 「FileStream」はどこに入っていますか?あなたの全体的なシナリオを理解してください。また、入力が実際に到着するのと同じ速さで処理できるかどうかも明記してください。 –

+1

@JonSkeet FileStreamは、新しい非同期関数を使用してファイルに書き込んでいることを示すものです。別のスレッド/タスクで処理が行われる理由は、処理が10msより長くなるためです。これを示すために質問を更新しました。 – Jon

答えて

1

10msごとに入力を受け取り、処理に10ms以上かかる場合、バックエンドで並列処理を行わない限り、処理を続行できません。

あなたの状況に最適なのは、プロデューサー/コンシューマーのアプローチのようです。別のスレッド/タスクでBlockingCollection<T>を使用できますが、Dataflow library(新しいVS Asyncサポートの一部)も考慮する必要があります。データフローライブラリを使用すると、データがシステムをどのように流れるかを定義するパイプライン(またはメッシュ)を設定できます。タスクは必要に応じて自動的に作成されます。

+0

私はあなたが新しいスレッドなしでBlockingCollectionを使うことができると知っていますが、入力と処理がすべてシームレスに動作するように他のスレッドにない場合、どのように動作するか分かりません。私はタスクが内部的にそれを処理し、物事を評価するはずですが、少し怖いと何も保証されていないと言われていますが、あなたは専用スレッドを持って知っているなら、 – Jon

+0

Dataflowドキュメントの動作は非常にはっきりしています。その動作を変更するには、いくつかのオプションがあります。データフローは 'BlockingCollection' AFAIKを使用しません。 –

1

キーワードasyncとawaitは、応答に時間がかかる関数/ APIへの非同期呼び出しの作成を支援するためのものです。コンパイラは、タスクを起動するメソッドと、呼び出しが完了したときにコールバックとなるメソッドの2つのメソッドを呼び出してラップします。

あなたのケースでは、作業を処理するために別のタスクを起動しているので、asyncとawaitを使用しても意味がないようです。仕事が終わった後に起こる必要がある第三のものはありません。

+0

私はasyncとawaitが非同期的に処理を行うだけでなく、終了時に何かをすること以外の目的で設計されていると思っていたでしょう。私は間違っているかもしれない? – Jon

+0

2つ以上の非同期要求がある場合、非同期アプリケーションは非常に書きにくいため、これらは導入されました。終了したすべての非同期操作、およびどの結果がどの操作に依存しているかを覚えておく必要があります。これは、コンパイラが自動的に行う方がはるかに簡単です。 Asyncはコンパイラに関数をいくつか追加する必要があることをコンパイラに伝え、ブレークがどこで起こるべきか正確に指示します。 – linkerro

関連する問題