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

  • 常规讨论

  • 就是我发现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上的大牛们指教指教小弟我。。让我能有所领略,小弟资质平庸,还望各位大侠悉心指教。

    没人自己顶!!!!

    2017年8月18日 7:32

全部回复

  • 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.

    2017年8月21日 9:32
    版主
  • 哎,吹的这么牛的Task任务多线程,竟然没人来回答,多线程貌似在任何程序中都会用到的啊,使用频率是很高的。。

    那么为何没有人来回答呢?高手呢?大神呢?MSDN的各路神仙呢??哎。。我不禁望天长叹,微软搞出来一个东西,能不能在配一个详细使用的文档啊。。MSDN上的类库说的不够详细!!!还请路过的各位神仙悉心指教!!!拜领教会!!!

    2017年9月8日 1:36
  • 这是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

    2017年9月12日 0:36
  • 现在用.net的人其实不太多,好多人转java了。。。。

    我也想转JAVA,,但时间不够充足~~~

    2017年9月12日 1:00
  • 是的,微软不识时务,总是强调版权,好多东西不开源,导致他现在的没落。要不是他的操作系统用的人多,都要基于Windows平台,那么微软早就不行了。好多后期开源的东西都是在竞争压力下,陆续开放出来的。
    2017年9月12日 11:33
  • @Shuanghua Li 你的回答让我明白了,这种微软的这种搞法是合理的。换言之在使用Task任务多线程时,必须要合理控制线程的退出!
    2017年9月12日 11:36