イベントを使用できますが、次のようにクラスTask<T>
でFromAsync
メソッドを使用することをお勧めします。TaskFactory
// Execution of tasks starts here because of the
// call to ToArray.
Task<WebResponse>[] tasks = uris.Select(u => {
// Create the request.
WebRequest req = ...;
// Make the call to return the response asynchronously with
// a Task.
return Task.Factory.FromAsync(req.BeginGetResponse,
req.EndGetResponse, null);
}).ToArray();
それができたら、クラスのメソッドTask<T>
を使用してすべてのインスタンスを簡単に待つことができます。ContinueWhenAll
TaskFactory
Task.Factory.ContinueWhenAll(tasks, t => {
// Note that t is an array of Task, so you have to cast
// each element to a Task<WebRequest>.
// Process all of them here.
});
上記は、Task
完了するまで待機するか、続行する必要がある a を返すことに注意してください (通知が心配な場合)。
.NET 4.5 を使用している場合、クラスでContinueWhenAll
メソッドを使用する必要はありませんが、クラスでメソッドを使用して作業を実行できます。TaskFactory
WhenAll
Task
// Note that work does not start here yet because of deferred execution.
// If you want it to start here, you can call ToArray like above.
IEnumerable<Task<WebResponse>> tasks = uris.Select(u => {
// Create the request.
WebRequest req = ...;
// Make the call to return the response asynchronously with
// a Task.
return Task.Factory.FromAsync(req.BeginGetResponse,
req.EndGetResponse, null);
});
// Execution will start at this call:
Task<Task<WebRequest>[]> allTasks = Task.WhenAll(tasks);
// Continue or wait here.
上記は、.NET 3.5 が使用されていることが明らかになる前のものであることに注意してください。