8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在没有 CancellationToken 的情况下停止任务

SollyBunny 1月前

37 0

我正在使用一个具有异步方法但没有 CancellationToken 重载的外部库。现在我正在使用另一个 StackOverflow 问题中的扩展方法来添加 CancellationTo...

方法但没有 async 的外部库 CancellationToken

现在我正在使用另一个 StackOverflow 问题的扩展方法来添加 CancellationToken

    public async static Task HandleCancellation(this Task asyncTask, CancellationToken cancellationToken)
    {
        // Create another task that completes as soon as cancellation is requested. http://.com/a/18672893/1149773
        TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
        cancellationToken.Register(() =>
            tcs.TrySetCanceled(), useSynchronizationContext: false);
        Task cancellationTask = tcs.Task;

        // Create a task that completes when either the async operation completes, or
        // cancellation is requested.
        Task readyTask = await Task.WhenAny(asyncTask, cancellationTask);

        // In case of cancellation, register a continuation to observe any unhandled exceptions
        // from the asynchronous operation (once it completes). In .NET 4.0, unobserved task
        // exceptions would terminate the process.
        if (readyTask == cancellationTask)
            asyncTask.ContinueWith(_ => asyncTask.Exception,
                TaskContinuationOptions.OnlyOnFaulted |
                TaskContinuationOptions.ExecuteSynchronously);

        await readyTask;
    }

但是底层任务仍然执行完成。这不会有什么大问题,但有时底层任务永远无法完成,并消耗了我 99% 的 CPU。

有没有什么办法可以“终止”任务而不终止进程?

帖子版权声明 1、本帖标题:在没有 CancellationToken 的情况下停止任务
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由SollyBunny在本站《multithreading》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 还有另一种可以使用取消的场景:Windows 服务。服务可能随时停止,并且服务需要停止其正在执行的操作并返回(从“Start”调用)。我的应用程序是一个长期运行的进程。我希望能够终止它,但如果它需要监视取消标记,这与将布尔变量传递到服务停止时设置的服务中没有太大区别。服务在各个点监视此标志并在看到时退出方法。这意味着代码必须在很多地方检查此标志。

返回
作者最近主题: