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

C# 取消调用第三方长时间运行方法的任务,c#,task,task-parallel-library,C#,Task,Task Parallel Library,我读了一些关于如何正确取消任务的文章。其中大多数描述:“您只需在长时间运行的方法中添加ThrowIfCancellationRequested()”——就是这样 好的-一切都很清楚,但如果我们不能修改方法,如何正确地做呢? 请看一下“DLL”类。我本想获取当前线程并中止它,但操作失败了 大多数程序员都不推荐它。所以我的问题是:如何正确地做到这一点 小例子: using System; using System.Threading; using System.Threading.Tasks; n

我读了一些关于如何正确取消任务的文章。其中大多数描述:“您只需在长时间运行的方法中添加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();
        }
    }
}
使用系统;
使用系统线程;
使用System.Threading.Tasks;
名称空间LongRunningTask
{
具有访问权限的静态类
{
公共静态无效DoHeavyOperation(取消令牌ct)
{
对于(int i=0;i<10000000;i++)
{
睡眠(500);
ct.ThrowIfCancellationRequested();
WriteLine(“我们可以修改的本地方法内部”);
}
}
}
静态类DLL
{
公共静态void DoHeavyOperation()
{
对于(int i=0;i<10000000;i++)
{
睡眠(500);
//ct.throwifcancellationrequest();我们无法执行此操作
Console.WriteLine(“内部DLL”);
}
}
}
班级计划
{
静态void Main(字符串[]参数)
{
CancellationTokenSource src=新的CancellationTokenSource();
CancellationToken ct=src.Token;
控制台写入线(“开始”);
Task.Run(()=>
{
//具有访问权限的类。DoHeavyOperation(ct);
DLL.DoHeavyOperation();
},ct);
睡眠(3000);
src.Cancel();
控制台。写入线(“取消”);
Console.ReadKey();
}
}
}

您使用的是哪种第三方库?它是开源的、Nuget的还是安全关键的程序集?另外,您是否知道代码有多复杂(基于它的功能)?如果您询问它,库的类型可能会有很大影响,并且根据我使用的库,答案会有所不同。我认为所有不支持cancellationToken的DLL都可以同样对待(如果我错了,请纠正我)。让我们考虑两个例子:1。这是一个以JSON格式2返回数据的大型sql查询。TCPScan方法,负责扫描网络中的设备,并返回有关设备的所有信息(哪些端口打开等)。这对你来说足够了吗?如果你没有访问第三方代码的权限,并且它不支持取消,那么强制杀戮可能是你唯一的赌注