请帮忙解决这个多线程的问题
操作代码:
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();
}
好像是这样的,不太记得了