询问者
请大牛们来谈谈C#任务多线程的终止方式的问题!

常规讨论
-
就是我发现Task多线程的终止方式,不算很好,没有原始的Thread的Abort好用。
贴出代码给大家分析一下:
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct1 = cts.Token;
Task<string> testOne = null;
try
{
testOne = new Task<string>((n) =>
{
//if (ct1.IsCancellationRequested) { return "Stop"; }
int sum = 0;
if (ct1.IsCancellationRequested) { ct1.ThrowIfCancellationRequested(); }
for (int i = 0; i < 100000; i++)
{
Console.WriteLine(string.Format("执行到任务进度{0}", i + 1));
sum += i + 1;
}
return sum.ToString();
}, "canshu", ct1, TaskCreationOptions.PreferFairness);
testOne.Start();
}
catch (Exception ex)
{
Console.WriteLine("testOne线程是否取消了:" + testOne.IsCanceled);
}
cts.Cancel();if (ct1.IsCancellationRequested) { ct1.ThrowIfCancellationRequested(); }这句话必须放到一个能否有监听作用的域里面才有用,我觉得。
因为,假如说我要调用去掉的时候,就里面取消,那么if (ct1.IsCancellationRequested) { ct1.ThrowIfCancellationRequested(); }这句话就要放到循环里面才有作用。
但是我就是有一个疑问,我想在调用Cancel函数的时候,就可以立即终结任务线程,而不用纠结if (ct1.IsCancellationRequested) { ct1.ThrowIfCancellationRequested(); }的放置位置,因为我发现要想合理的终止自己线程的业务逻辑,必须要合理放置此句:if (ct1.IsCancellationRequested) { ct1.ThrowIfCancellationRequested(); }代码才行。这样的话,我就觉得Task的取消还没有Thread来的方便,就觉得鸡肋了。
之前一直使用的是原始的Thread,虽然Task出来很久了,但是我还一直没怎么用过。
但是最近,我看到一个同道人写了关于Task的一些优点后,我于是就想研究一下Task,然后在今后使用它,然后就突然发现了它的这个关于取消和终止任务的不尽人意的地方(个人观点),所以请MSDN上的大牛们指教指教小弟我。。让我能有所领略,小弟资质平庸,还望各位大侠悉心指教。
没人自己顶!!!!
- 已更改类型 TheYangtzeTheYellowRiver 2017年8月24日 3:30
- 已编辑 TheYangtzeTheYellowRiver 2017年9月8日 1:37
全部回复
-
Hi,
感谢你在MSDN论坛发帖。
根据你的描述,我觉得这不是代码的问题,而是技术的探讨,我建议你把帖子的类型,改成讨论贴,这样就会让更多的人参与这个帖子。
我个人觉得task,在多任务的时候,还是方便许多。 task 应该就像我应该在哪里去执行一些代码。
task的delay 函数不需要CPU的时间,如果是thread的delay函数在UI进程中,程序就会拖不动。
Best Regards,
Hart
Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.
-
这是API的设计方法,两种方法取消task/thread
1 if (ct1.IsCancellationRequested) { ct1.ThrowIfCancellationRequested();
2 Cancel函数的时候,就可以立即终结任务线程
微软并没有提供第二种方法,我可以理解的第二种方法产生的问题是,已经执行到一半的事务,如何取消,这部分代码又与API 框架无关,只有用户来控制才合理,也就是控制真正执行线程任务的代码。比如文件写到一半,任务取消,用户可以选择忽略继续写入,放弃文件,也可以选择将已经写的字节保存,而这部分代码,只有用户有控制权才会合理,框架无法为你选择事务的结束方法。
专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms