Ответ 1
Во многих ситуациях вам нужно TaskCompletionSource
.
Вероятно, у вас есть метод, который способен генерировать данные в определенный момент времени, но для этого не используется задача. Возможно, есть метод, который выполняет обратный вызов, который дает результат, или событие, которое запускается, чтобы указать, что есть результат, или просто код с использованием Thread
или ThreadPool
, который вы не склонны перегруппировать в используя Task.Run
.
public Task<SomeData> GetTheData()
{
TaskCompletionSource<SomeData> tcs = new TaskCompletionSource<SomeData>();
SomeObject worker = new SomeObject();
worker.WorkCompleted += result => tcs.SetResult(result);
worker.DoWork();
return tcs.Task;
}
В то время как вам может потребоваться/нужно предоставить TaskCompletionSource
рабочему или другому классу или каким-либо другим способом выставить его в более широкую область, я нашел, что он часто не нужен, хотя он очень мощный вариант, когда он подходит.
Также возможно, что вы можете использовать Task.FromAsync
для создания задачи на основе асинхронной операции, а затем либо вернуть эту задачу напрямую, либо await
в свой код.