我正在使用一个任务来进行长时间运行的异步处理操作,我希望能够在任意时刻暂停和恢复。对我来说幸运的是,Microsoft 的 TPL 自己的作者之一已经提出了这个问题的解决方案。唯一的麻烦是他的解决方案不能正常工作。
当您删除await Task.Delay(100)下面代码中的 时,代码将在第一个请求之后停止接受暂停请求。如果 的值可信的话,代码似乎SomeMethodAsync会在与其他任务相同的线程上恢复执行。Thread.CurrentThread.ManagedThreadId的输出还SomeMethodAsync表明它正在多个线程上运行。
我一直发现 TPL 相当混乱且难以使用,而 async/await 更是如此,所以我很难理解这里到底发生了什么。如果有人能解释的话,我将非常感激。
极简示例代码:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace PauseTokenTest {
class Program {
static void Main() {
var pts = new PauseTokenSource();
Task.Run(() =>
{
while (true) {
Console.ReadLine();
Console.WriteLine(
$"{Thread.CurrentThread.ManagedThreadId}: Pausing task");
pts.IsPaused = !pts.IsPaused;
}
});
SomeMethodAsync(pts.Token).Wait();
}
public static async Task SomeMethodAsync(PauseToken pause) {
for (int i = 0; ; i++) {
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}: {i}"); …Run Code Online (Sandbox Code Playgroud)