小编use*_*019的帖子

协作暂停异步方法

我正在使用一个任务来进行长时间运行的异步处理操作,我希望能够在任意时刻暂停和恢复。对我来说幸运的是,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)

c# asynchronous task-parallel-library async-await pause

2
推荐指数
1
解决办法
118
查看次数