Jest coś niejasnego dla mnie o wewnętrznych działaniach TaskCompletionSource<>
.Jaki jest cel TaskCreationOptions z TaskCompletionSource?
Podczas tworzenia prostego Task<>
przy użyciu Factory
, oczekuję, że to zadanie zostanie umieszczone w puli wątków, chyba że podam TaskCreationOptions.LongRunning
, gdzie będzie on działał w nowym wątku.
Moje zrozumienie TaskCompletionSource
polega na tym, że jestem odpowiedzialny za wyzwalanie, gdy zadanie się kończy, lub zawiedzie, i mam pełną kontrolę nad zarządzaniem wątkami. Jednak ctor z TaskCompletionSource
pozwala mi określić TaskCreationOptions
, a to zmyli mnie, ponieważ oczekiwałem, że Scheduler
nie jest w stanie obsłużyć samego zadania.
Jaki jest cel TaskCreationOptions
w kontekście TaskCompletionSource<>
?
Oto przykład użycia:
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;
}
Cóż, można zobaczyć, co zostało wykorzystane przez powstały zadania, więc przypuszczam, że to możliwe, że niektóre kod może być przekazany do TCS lub zadanie i zrobić coś na podstawie wyniku jednej z tych opcji (w niestandardowym kodzie przetwarzającym to zadanie). – Servy