当前位置: 首页 > 编程语言 > C#

取消-中止任务分享

时间:2023-04-10 13:24:56 C#

C#中的取消/中止任务我有一个C#程序,可以进行一些服务调用。我需要向该程序添加一些代码,以便能够在单击按钮(winform)时停止这些服务调用[例如,如果调用时间太长并且用户感到无聊]。困难在于我无法修改执行调用的代码块。为了做到这一点,我打算用UnityFramework做一些拦截。每次输入服务调用代码块时,我都想创建一个任务。然后,如果用户单击我的按钮,我将取消此任务。我查看了CancellationToken,但问题是我无法修改调用块,所以我无法执行if(ct.IsCancellationRequested)或ct.ThrowIfCancellationRequested();AutoResetEvent和ManualResetEvent是一样的。调用并不总是异步的,并且使用了cancelToken,所以我认为不可能捕获OperationCanceledException。我也看过使用Threads和做一些Thread.Abort()但这种方法似乎每次有人调用它时都会杀死小狗。这是我当前程序的一个例子(拦截还没有实现,我想先在一个调用中测试它)://如何在按下按钮时取消任务?}//不能触及此函数的内部:privatevoidMyServiceCallFunction(){//Blabla我为调用准备数据//Blabla我调用}我该怎么做?(我没有义务使用任务)谢谢,“正确”的方法是使用CancellationTokens,但由于您无法修改正在运行的代码,唯一的其他方法是杀死小狗并使用Thread.Abort()之类的:线程t;Task.Factory.StartNew(()=>{t=Thread.CurrentThread;MyServiceCallFunction();});t.中止();非常有趣的问题。当第3方呼叫进入TPL时,您当然无能为力;在你的例子中是MyServiceCallFunction()。我一直在这篇博客文章中帮助我遇到类似情况:https://social.msdn.microsoft.com/Forums/vstudio/en-US/d0bcb415-fb1e-42e4-90f8-c43a088537fb/aborting-a-长期任务-in-TPL?Forum=parallelextensions(阅读:StephenToub-MSFTMicrosoft(MSFT)评论)他提到了这个解决方案:intTest(CancellationTokentoken){ThreadcurrentThread=Thread.CurrentThread;使用(token.Register(currentThread.Abort)){MyServiceCallFunction()}}也用Task.Run(…)替换Task.Factory.StartNew(…);同样,后者更强大,但可读性更好。以上就是《C#学习教程:C#取消/暂停任务共享》。如果对你有用,需要进一步了解《C#学习教程》,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: