c# – Task.Factory.FromAsRegister with CancellationTokenSource

我有以下代码行用于从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仅包含行为(但不控制它).

现在,因为取消是一个TPL特定的构造,并且由于FromAsync对被调用的异步方法的内部工作无法控制,所以没有保证干净地取消任务的方法,并确保所有资源都正确关闭(这就是为什么如果你好奇,只是反编译方法;))

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

总之,答案是否定的,但是没有什么可以阻止你创建一个通用的重载方法,它将根据它的类型选择正确的策略去干净地关闭流.

翻译自:https://stackoverflow.com/questions/24980427/task-factory-fromasync-with-cancellationtokensource

转载注明原文:c# – Task.Factory.FromAsRegister with CancellationTokenSource