私は、非同期に実行されるいくつかの作業をキューに入れるメソッドを持っています。私はポーリング、待機、または操作からの戻り値を取得するために使用される呼び出し元に何らかの処理を戻したいと思いますが、タスクに適したクラスまたはインターフェイスを見つけることができません。呼び出し元に戻るための非同期結果ハンドル
BackgroundWorkerは近づいてきますが、私の場合はワーカーが独自の専用スレッドを持っている場合に対応しています。 IAsyncResultは有望ですが、提供されたAsyncResultの実装も私にとっては使えません。 IAsyncResultを自分で実装する必要がありますか?
明確化:
class AsyncScheduler
{
private List<object> _workList = new List<object>();
private bool _finished = false;
public SomeHandle QueueAsyncWork(object workObject)
{
// simplified for the sake of example
_workList.Add(workObject);
return SomeHandle;
}
private void WorkThread()
{
// simplified for the sake of example
while (!_finished)
{
foreach (object workObject in _workList)
{
if (!workObject.IsFinished)
{
workObject.DoSomeWork();
}
}
Thread.Sleep(1000);
}
}
}
QueueAsyncWork機能は、専用の作業スレッドのポーリングリスト上に作業項目をプッシュし、そこになるの:
私は概念的にはこのようになりますクラスを持っていますただ1つに過ぎない。私の問題は、QueueAsyncWork関数を書くことではない - それは問題ありません。私の質問は、私は呼び出し元に何を返すのですか? SomeHandle
はどうすればよいですか?
このための既存の.Netクラスは、非同期操作を返す単一のメソッド呼び出しでカプセル化できる状況に対応しています。これはここには当てはまりません。すべての作業オブジェクトは同じスレッド上で作業を行い、完全な作業操作はworkObject.DoSomeWork()
への複数の呼び出しにまたがることがあります。この場合、呼び出し元に進捗通知、完了、および操作の最終結果を得るための処理を提供する合理的なアプローチは何ですか?
'提供されているAsyncResult実装も私にとっては使用できません' ...説明できますか? –
あなたは今何を意味しているのか分かります。より良い答えを出そうとしています。 DoSomeWorkの内部には、タスクの進捗状況があると思いますか? –
好奇心を要して、なぜあなたのワーカー・メソッドはすべて同じスレッドで実行する必要がありますか?私は多くの非同期作業を行いましたが、以前はその要件を見ていませんでした。 –