C# 在C语言中取消/中止任务#

C# 在C语言中取消/中止任务#,c#,multithreading,C#,Multithreading,我有一个C#语言的程序,它执行一些服务调用。 我需要在此程序中添加一些代码,以便在我单击按钮(winform)时能够停止这些服务调用[例如,如果调用太长,用户感到无聊] 困难在于我不能修改执行调用的代码块 为了做到这一点,我计划使用Unity框架进行一些拦截。 我想在每次输入服务调用代码块时创建一个任务。然后,如果用户单击“我的”按钮,则取消此任务 我已经查看了CancellationToken,但问题是我无法修改调用块,因此如果(ct.IsCancellationRequested)或ct.t

我有一个C#语言的程序,它执行一些服务调用。 我需要在此程序中添加一些代码,以便在我单击按钮(winform)时能够停止这些服务调用[例如,如果调用太长,用户感到无聊]

困难在于我不能修改执行调用的代码块

为了做到这一点,我计划使用Unity框架进行一些拦截。 我想在每次输入服务调用代码块时创建一个任务。然后,如果用户单击“我的”按钮,则取消此任务

我已经查看了CancellationToken,但问题是我无法修改调用块,因此如果(ct.IsCancellationRequested)或
ct.throwifcCancellationRequested(),我无法执行
if(ct.IsCancellationRequested)
自动重置事件和手动重置事件也是如此。 调用并不总是异步的,并且是使用cancellationToken进行的,因此我认为捕获
OperationCanceledException
是不可能的

我还研究了如何使用线程,并做了一些
Thread.Abort()
,但是每次有人调用它时,这个方法似乎都会杀死小狗

下面是我当前程序的一个示例(截取尚未实现,我想先在一个调用上测试它):

我该怎么做?(我没有义务使用任务)

谢谢,

正确的方法是使用CancellationToken,但由于您无法修改正在运行的代码,唯一的其他方法是杀死幼犬并使用Thread.Abort()

比如:

Thread t;
Task.Factory.StartNew(() =>
    {
        t = Thread.CurrentThread;
        MyServiceCallFunction();
    });

t.Abort();

非常有趣的问题。当然,当第三方呼叫正在进行第三方物流时,您不能做任何事情;在您的例子中,它是MyServiceCallFunction()

我也遇到过类似的情况,这篇博文帮助了我:

(阅读:Stephen Toub-MSFTMicrosoft(MSFT)评论)

他提到了这一解决办法:

int Test(CancellationToken token)
    {
        Thread currentThread = Thread.CurrentThread;
        using (token.Register(currentThread.Abort))
        {
            MyServiceCallFunction()
        }
    }

还将Task.Factory.StartNew(…)替换为Task.Run(…);同样,感染后者更强大,但可读性更好。

不要使用
Thread
s,除非您认为可以比.NET更好地管理它们framework@user1274820事实上,你只是不关心你造成的所有问题并不意味着它们不存在。TPL没有公开一种中止底层线程的方法,这不是因为它试图变得残忍,也不是因为它是一种疏忽,而是因为用户根本不知道它会导致什么复杂情况,也不知道如何设计他们的程序,使其能够在代码中任何地方抛出任意异常的情况下正常运行。在这种情况下,地球上几乎没有任何程序能正常运行。可能是@user1274820的复制品。因此,如果你站在路上,一辆汽车向你飞驰而来,你就捂住眼睛,因为你没有注意到的问题不是问题?你没有意识到不好的事情正在发生并不意味着它们没有发生,它只是意味着你实际上没有能力解决这些问题。@wdosanjos请停止传播错误信息<代码>线程。中止()
不折旧。查找它。^无论好坏,它都很简单,99.99%的时间都有效。@user1274820它并不总是错误的,只是经常错误,建议在不合适的情况下使用它,并且没有适当的指示,只是因为它看起来很容易,尽管它可能会给寻求有效解决方案的人带来各种问题和头痛,但它弊大于利。你为帮助人们制造问题而感到如此自豪……令人沮丧。@Servy当有代码使其成为可能时,你接受“这是不可能的”作为对问题的回答,这一事实让我感到沮丧。@user1274820你说的话表明你不理解代码的实际功能。如果你认为它解决了问题,而实际上它没有解决问题,那么当你意识到问题实际上没有解决时,你的境况会更糟。此外,我并没有说解决问题是不可能的,只是说这种方法不是一个可接受的解决方案。我们要么接受它,要么听其自然。正如我最初所说,正确的方法是使用取消代币,但既然你说你不能,看看这是否对你有效。合理警告:彻底测试并使用,风险自负。正如您所说,此解决方案类似于杀死幼犬,但可能适用于您的情况。也使用
Thread.Abort()
,但将其与
CancellationToken
链接,使其看起来“更正确”。我想知道社区将如何接受此响应。
int Test(CancellationToken token)
    {
        Thread currentThread = Thread.CurrentThread;
        using (token.Register(currentThread.Abort))
        {
            MyServiceCallFunction()
        }
    }