gpt4 book ai didi

c# - 带有 CancellationTokenSource 的 Task.Factory.FromAsync

转载 作者:可可西里 更新时间:2023-11-01 08:05:06 44 4
gpt4 key购买 nike

我有以下代码行用于从 NetworkStream 异步读取:

int bytesRead = await Task<int>.Factory.FromAsync(this.stream.BeginRead, this.stream.EndRead, buffer, 0, buffer.Length, null);

我想让它支持取消。我知道我可以 cancel tasks using a CancellationTokenSource , 但是我看不出有什么方法可以将它传递给 TaskFactory.FromAsync() .

是否可以使 FromAsync() 构造的任务支持取消?

编辑:我想取消一个已经在运行的任务。

最佳答案

Gigi,不幸的是,FromAsync 的语义性质表明您只是将异步过程调整为 TPL 的 API (TPL = Microsoft's Task Parallel Library)

本质上,TPL 的 ReadAsync 控制异步行为本身,而 FromAsync 仅包装行为(但不控制它)。

现在,由于 Cancellation 是 TPL 特定的构造,并且由于 FromAsync 无法控制被调用的异步方法的内部工作,因此无法保证完全取消任务并确保正确关闭所有资源(这这就是它被省略的原因。如果你很好奇,只需反编译该方法即可;))

在这些情况下,将自己的实际异步调用包装在正常任务中并检测 OperationCancelled 异常更有意义,这将使您有机会通过进行适当的调用来关闭流。

简而言之,答案是,但没有什么能阻止您创建一个通用的重载方法,该方法将根据流的类型选择正确的策略来彻底关闭流。

关于c# - 带有 CancellationTokenSource 的 Task.Factory.FromAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24980427/

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