首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

请帮忙解决这个多线程的有关问题

2012-01-19 
请帮忙解决这个多线程的问题操作代码:privatevoidCalc(){DateTimestDateTime.Now//计算数值分段step(ma

请帮忙解决这个多线程的问题
操作代码:
private   void   Calc()
                {
                        DateTime   st   =   DateTime.Now;
                        //计算数值分段
                        step   =   (maxValue   -   minValue   +   1)   /   threadNumber;
                        //获取当前线程名
                        long   threadName   =   Convert.ToInt64(Thread.CurrentThread.Name);
                        //当前线程计算的开始值与结束值
                        beginNumber   =   minValue   +   step   *   (threadName   -   1);
                        endNumber   =   beginNumber   +   step;
                        //累加数值
                        result   =   0;
                        for   (long   i   =   beginNumber;   i   <   endNumber;   i++)
                        {
                                result++;
                        }
                        lock   (this)
                        {
                                long   sum   =   Convert.ToInt64(this.txtResult.Text);
                                sum   +=   result;
                                this.txtResult.Text   =   sum.ToString();
                        }
                        DateTime   et   =   DateTime.Now;
                        TimeSpan   t   =   et   -   st;
                        string   message   =   "线程 "   +   Thread.CurrentThread.Name   +   ": "   +   beginNumber.ToString()   +   "至 "   +
                                endNumber.ToString()   +   ",耗时: "   +   t.TotalMilliseconds.ToString()   +   "毫秒 ";
                        this.lstShow.Items.Add(message);


                        Thread.CurrentThread.Abort();
                }
异常提示:
Cross-thread   operation   not   valid:   Control   'txtResult '   accessed   from   a   thread   other   than   the   thread   it   was   created   on.

[解决办法]
显示 this.txtResult.Text = sum.ToString();

的方法用Invoke的方式显示
[解决办法]
private void Calc()方法在另外一个线程中执行吧。Control的只能在创建Control的句柄中调用。txtResult和lstShow都要Invoke或BeginInvoke到Control的句柄所在线程中。
写成如下。
this.Invoke(new InvokeDelegate(InvokeMethod));
//下边的注意定义的地方
private void InvokeMethod(){
this.txtResult.Text = sum.ToString();
}
private delegate void InvokeDelegate();
[解决办法]
object[] pList = { this, System.EventArgs.Empty };
txtResult.BeginInvoke(new System.EventHandler(UpdateLableText), pList);


private void UpdateLableText(object o, System.EventArgs e)
{
txtResult.Text = sum.ToString();
}

好像是这样的,不太记得了

热点排行