gpt4 book ai didi

c# - 没有 TaskCompletionSource 的任务链?

转载 作者:太空狗 更新时间:2023-10-29 23:17:56 24 4
gpt4 key购买 nike

我正在将一些异步/等待代码转换为链式任务,因此我可以在已发布的框架中使用它。等待代码如下所示

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() {}

我希望链InvokeMemorize返回 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 的情况下完成此操作? ?

最佳答案

是的,该框架带有一个方便的 Unwrap() 扩展方法,正是您想要的。

Invoke("GET").ContinueWith( t => t.Result.Memorize() ).Unwrap();

如果您要取消,那么显然您需要将取消 token 传递到适当的位置。

关于c# - 没有 TaskCompletionSource 的任务链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6884470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com