Codeplex でダウンロード マネージャー タイプのプロジェクトを調べていたところ、 http ://nthdownload.codeplex.com/ に出会いました。
AddDownloads
以下にリストされているようなメソッドに出くわしたコードをブラウズします。
AddDownloads
_downloadQueue.AddDownloads タスクを開始し、タスクを続行しviewMaintenanceTask
ます。これら 2 つのタスクとダウンストリームで発生するメソッドと物事を見ると、すべてが同期しているように見えます。
また、このブログ投稿「Synchronous tasks with Task」を読んで、同期メソッドをTaskCompletionSource
. API コンシューマに別のスレッドでタスクを開始するオプションを与えるためか、単にメソッドをTask
. 同期メソッドはTaskCompletionSource
並列処理の恩恵を受けますか?
private Task<QueueOperation> AddDownloads(IEnumerable<IDownload> downloads, out Task<QueueOperation> startTask)
{
var addTask = _downloadQueue.AddDownloads(downloads, out startTask);
// Maintain views
var viewMaintenanceTask = addTask.ContinueWith(t =>
{
if (t.Exception == null)
{
var addedDownloads = t.Result.DownloadErrors.Where(k => k.Value == null).Select(k => k.Key).ToList();
var activeDownloads = ActiveDownloads.ToList();
AddToActiveDownloads(addedDownloads.Except(activeDownloads).ToList(), false);
}
else
{
// Rethrow exception, this ensures it'll bubble up to any further ContinueWith chained off this task
throw t.Exception;
}
return t.Result;
});
return viewMaintenanceTask;
}
ブログ投稿のメソッドの例で、同期操作を次のようにラップしていTaskCompletionSource
ます。
var tcs = new TaskCompletionSource<object>();
try
{
object result = model.Deserialize(stream, null, type);
tcs.SetResult(result);
}
catch (Exception ex)
{
tcs.SetException(ex);
}
return tcs.Task;