Windows窗体体系结构的约束:
不能在UI线程之外的其他线程(worker线程)调用UI的任何成员。
例如:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Test
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public partial class Form1 : Form
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public Form1()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
InitializeComponent();
}
public delegate int OnAdd(int i, int j);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int Add(int m, int n)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int sum = m + n;
button1.Text = sum.ToString();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return sum;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private void button1_Click(object sender, EventArgs e)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
OnAdd proc = Add;
System.IAsyncResult async = proc.BeginInvoke(1, 1, null, null);
// 下面两行等待proc完成,所以要想让界面有
// 反映(假设IntAdd需要花一些时间才能完成),还要注释掉它们。
int sum = proc.EndInvoke(async);
Console.WriteLine(sum);
}
}
}
“异步委托调用”通过线程池中的线程访问了button1.Text。于是出错了!
正确的更新UI方法:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace Test
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public partial class Form1 : Form
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public Form1()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
InitializeComponent();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public delegate int OnAdd(int i, int j);
public delegate void OnUpdateUI(object sender, string text);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int Add(int m, int n)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int sum = m + n;
//button1.Text = sum.ToString();
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
object[] pList =
{ this, sum.ToString() };
button1.BeginInvoke(new OnUpdateUI(UpdateUI), pList);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return sum;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private void UpdateUI(object sender, string text)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
button1.Text = text;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private void button1_Click(object sender, EventArgs e)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
OnAdd proc = Add;
System.IAsyncResult async = proc.BeginInvoke(1, 1, null, null);
// 下面两行等待proc完成,所以要想让界面有
// 反映(假设IntAdd需要花一些时间才能完成),还要注释掉它们。
int sum = proc.EndInvoke(async);
Console.WriteLine(sum);
}
}
}
http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx?mfr=true
待续。。。