取消调用第三方长时间运行方法的任务

时间:2017-11-21 18:30:06

标签: c# task task-parallel-library

我读了一些文章如何核心取消任务。他们中的大多数描述:“你必须在长时间运行的方法中添加ThrowIfCancellationRequested()” - 就是这样。

好的 - 一切都很清楚但是如果我们不能修改方法怎么做呢? 请看一下“DLL”类。我想要获取当前线程并中止它但该操作 是大多数程序员不推荐的。所以我的问题是:如何正确地做到这一点?

小例子:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace LongRunningTask
{
    static class ClassWithAccess
    {
        public static void DoHeavyOperation(CancellationToken ct)
        {
            for (int i = 0; i < 10000000; i++)
            {
                Thread.Sleep(500);
                ct.ThrowIfCancellationRequested();
                Console.WriteLine("inside local method that we can modify");
            }
        }
    }

    static class DLL
    {
        public static void DoHeavyOperation()
        {
            for (int i = 0; i < 10000000; i++)
            {
                Thread.Sleep(500);
                //ct.ThrowIfCancellationRequested(); we can't do this
                Console.WriteLine("inside DLL");
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            CancellationTokenSource src = new CancellationTokenSource();
            CancellationToken ct = src.Token;
            Console.WriteLine("start");

            Task.Run(() =>
            {
                //ClassWithAccess.DoHeavyOperation(ct);         
                DLL.DoHeavyOperation();
            }, ct);

            Thread.Sleep(3000);
            src.Cancel();
            Console.WriteLine("Cancel");
            Console.ReadKey();
        }
    }
}

0 个答案:

没有答案