Я конвертирую некоторый асинхронный / ожидающий код в связанные задачи, чтобы я мог использовать его в выпущенной среде. Код ожидания выглядит следующим образом
public async Task<TraumMessage> Get() {
var message = await Invoke("GET");
var memorized = await message.Memorize();
return memorized;
}
, где
Task<TraumMessage> Invoke(string verb) {}
Task<TraumMessage> Memorize() {}
Я надеялся соединить Invoke
и Memorize
, чтобы вернуть задачу, созданную Memorize
, но в результате Task<Task<TraumMessage>
. Решение, которое я нашел, - это TaskCompletionSource<TraumMessage>
как мой сигнал:
public Task<TraumMessage> Get() {
var completion = new TaskCompletionSource<TraumMessage>();
Invoke("GET").ContinueWith( t1 => {
if(t1.IsFaulted) {
completion.SetException(t1.Exception);
return;
}
t1.Result.Memorize().ContinueWith( t2 => {
if(t2.IsFaulted) {
completion.SetException(t2.Exception);
return;
}
completion.SetResult(t2.Result);
});
});
return completion.Task;
}
Есть ли способ сделать это без TaskCompletionSource
?