の内部動作について、私には不明確なことがありTaskCompletionSource<>
ます。
Task<>
を使用して単純なものを作成する場合Factory
、指定しない限り、このタスクはスレッドプールにエンキューされることを期待します。指定しない限り、TaskCreationOptions.LongRunning
代わりに新しいスレッドで実行されます。
私の理解でTaskCompletionSource
は、タスクが終了または失敗したときにトリガーする責任があり、スレッドの管理方法を完全に制御できます。ただし、のctorを使用すると、TaskCompletionSource
を指定できます。これは、タスク自体を処理できないことTaskCreationOptions
を期待していたため、混乱します。Scheduler
TaskCreationOptions
の文脈での目的は何TaskCompletionSource<>
ですか?
使用例を次に示します。
public Task<WebResponse> Download(string url)
{
TaskCompletionSource<WebResponse> tcs =
new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);
var client = (HttpWebRequest)HttpWebRequest.Create(url);
var async = client.BeginGetResponse(o =>
{
try
{
WebResponse resp = client.EndGetResponse(o);
tcs.SetResult(resp);
}
catch (Exception ex)
{
tcs.SetException(ex);
}
}, null);
return tcs.Task;
}