Sam*_*uyn 1 .net c# async-await
我只有一个同步操作,可能需要很多时间才能完成。该操作的调用者提供了一个CancellationToken符号,并且在令牌被取消后,该操作应立即停止(在这种情况下,取消后的几毫秒内也将起作用)。
如何将其包装在带有CancellationToken的任务中?
我无法更改调用代码或调用本身。
曾经是: LongOperation();
我现在所拥有的: await Task.Run(() => LongOperation(), cancellationToken).ConfigureAwait(false);
显然,这是行不通的,因为您必须在给的操作中轮询令牌Task.Run。
我无法更改调用代码或调用本身。
显然,这是行不通的,因为您必须轮询赋予Task.Run的操作内的令牌。
通过远最简单的解决方法是解除的条件之一:要么允许CancellationToken被忽略,或者改变被叫代码。
如果确实不能实现,那么您将需要在另一个进程中运行代码。因此,您需要启动一个可以访问该方法的子进程,将所有参数打包到该方法中,然后再封送任何结果值或异常。然后,当令牌被取消时,终止进程。
有做同样的事情的不太安全的方式:你可以在另一个运行代码AppDomain并关闭AppDomain上取消,也可以运行在其他的代码Thread,并Abort在Thread上取消。但是,这两种方法都容易导致资源泄漏或应用程序稳定性问题。唯一真正安全的方法是单独的过程。
| 归档时间: |
|
| 查看次数: |
518 次 |
| 最近记录: |