Как Task.Factory.FromAsync работает / ведет себя? - PullRequest
4 голосов
/ 16 октября 2011

Я относительно новичок в C #, поэтому, пожалуйста, потерпите меня.

Я пытаюсь понять, как работает Task FromAsync.

var task1 = Task<int>.Factory.FromAsync(Foo1, ...);  //what happens here? Is this 
called on a thread from threadpool?

SomeCode1(); // <- is this code executed in parallel with Foo1

task1.ContinueWith(Foo2,...);   //does this block the current thread until Foo1
 finishes? Shouldn't it act like a callback? If this whole code runs on a "normal"
thread does it block it? If this runs on a thread from a thread pool does it 
 release the thread until Foo1 finishes?

SomeCode2();  

Спасибо за вашу помощь, я действительно борюсь с асинхронным программированием.

1 Ответ

5 голосов
/ 16 октября 2011

FromAsync предоставляет удобный механизм, использующий методы BeginXxx и EndXxx модели асинхронного программирования (APM) для создания Task.

Полученного результата.Task по умолчанию будет выполняться в потоке пула потоков (и ваш последующий вызов SomeCode1() действительно будет выполняться в текущем потоке параллельно Task).

ContinueWith метод в Task действительно действует скорее как обратный вызов, то есть делегат, предоставленный этому методу, будет выполняться после завершения задачи, также в некотором потоке пула потоков. не блокирует текущий поток.

Действительно, вы должны настроить это продолжение при создании задачи, например,

var task1 = Task<int>.Factory.FromAsync(Foo1, ...).ContinueWith(Foo2,...);

Для получения более общей и подробной информации оПотоки в .NET Я настоятельно рекомендую прочитать хороший текст, такой как часть V CLR через C # .

...