10N個のアイテムがあるとします(httpプロトコルを介してそれらをフェッチする必要があります)。コードでは、N個のタスクがデータの取得を開始し、各タスクは10個のアイテムを順番に取得します。アイテムを入れますConcurrentQueue<Item>
。その後、アイテムはスレッドセーフな方法で1つずつ処理されます。
async Task<Item> GetItemAsync()
{
//fetch one item from the internet
}
async Task DoWork()
{
var tasks = new List<Task>();
var items = new ConcurrentQueue<Item>();
var handles = new List<ManualResetEvent>();
for i 1 -> N
{
var handle = new ManualResetEvent(false);
handles.Add(handle);
tasks.Add(Task.Factory.StartNew(async delegate
{
for j 1 -> 10
{
var item = await GetItemAsync();
items.Enqueue(item);
}
handle.Set();
});
}
//begin to process the items when any handle is set
WaitHandle.WaitAny(handles);
while(true)
{
if (all handles are set && items collection is empty) //***
break;
//in another word: all tasks are really completed
while(items.TryDequeue(out item))
{
AThreadUnsafeMethod(item); //process items one by one
}
}
}
でマークされたステートメントに条件を配置できるかどうかはわかりません***
。Task.IsCompleted
タスクで使用しているため、ここではプロパティを使用できませんawait
。タスクはすぐに完了します。そして、bool[]
タスクが最後まで実行されるかどうかを示すaは、ManualResetEventでも同じ作業を実行できると思うので、本当に見苦しいように見えます。誰かが私に提案を与えることができますか?