日期:2014-05-17  浏览次数:20908 次

C# TPL并行只执行一部分就退出,求解?
背景介绍:
     
     开发环境 :VS2010简体中文旗舰版
     .net 版本:.net4.0
     CPU      :双核四线程【Intel】
     错误现象 :使用 TPL 编写多核并行代码,发现只并行了其中的一部分(不能并行到底),之后就由一条线程执行到结束。编译时,代码没有问题,运行时,有时候出现运行到一定程度,程序就卡住,不再执行下去,就像死机一样。下面就贴出代码。
    
C# 并行 TPL 执行不彻底 卡住

------解决方案--------------------
当然了,在非UI线程操作界面需要使用Control.Invoke让界面去刷新。
------解决方案--------------------
把你的 this.Invoke 改为 this.BeginInvoke。

我印象中,我好像从来没有使用过 Invoke,都是 BeginIncoke。我从来都非常注意不要稀里糊涂地写出阻塞式的程序。
------解决方案--------------------
哎,把 static System.Threading.Semaphore sep = new System.Threading.Semaphore(1, 4);
跟sep.Release();  那两行注释掉就那么难吗?
实在搞不懂你这里用Semaphore来做什么,如果你真的控制并发度应该由Parallel.Invoke ParallelOptions来控制啊。
还有,你的程序问题很多,很多代码写的很随意的, 下面的代码要它干嘛的?根本起不到作用。
    if( this.InvokeRequired )   // 返回值为 true,表示来自 UI 线程;
            //if ( true )               // 返回值为 true,表示来自 UI 线程;
        {
                Object[] value = { this.txtShow };
                this.Invoke(this.sf, value);
        }

另外,我就好奇为什么你能在main thread之外更新线程了,原来你用了CheckForIllegalCrossThreadCalls,这????