WebクライアントのDownloadFileAsyncは、イベントベースの非同期モデルにTPLを適用するための良い機会を提供します。 DownloadFileAsyncの呼び出しを含むアクションがすぐに完了するため、実際の作業はDownloadFileCompletedイベントがトリガーされるまで行われません。これは、TaskCompletionSourceが動作する場所です。
var downloadCompletionSource = new TaskCompletionSource<bool>();
webClient.DownloadFileCompleted+=
(s, e) =>
{
if (e.Error != null)
{
downloadCompletionSource.SetException(e.Error);
}
else
{
downloadCompletionSource.SetResult(true);
}
}
};
webClient.DownloadFileAsync(new Uri(downloadUrl), destinationFilePath);
try
{
downloadCompletionSource.Task.Wait();
}
catch (AggregateException e)
{
}
詳細はin MSDN
ここで見つけることができます