在.NET 2.0中,多线程中,一个线程要访问一个用户界面控件,会报出一个异常,说是从不能从线程外访问用户界面控件。以前的时候是不会有问题,但是这样可能让人在调试应用程序时摸不着头脑。在.Net 1.1时,我记得有一次在做多线程监控程序时,因为在线程外调用了一个PageControl的SelectIndex,导致一个异常,却找不到问题的地方。因为在设置TextBox时是没有问题,而在设置PageControl时却不行。
在.NET 2.0中,这样的情况不会出现了。可是在线程外调用用户界面控件时要多加几道工序。先设置一个delegate,然后在线程调用时加入一个判断,InvokeRequired属性。代码如下:
delegate void SetTextBoxCallback(string text);
private void SetSendedInfo(string sInfo)
{
if (txt_ViewSend.InvokeRequired)
{
SetTextBoxCallback d = new SetTextBoxCallback(SetSendedInfo);
this.Invoke(d, new object[] { sInfo });
}
else
{
txt_ViewSend.Text = sInfo;
}
}
private void timer1_Tick(object sender, EventArgs e)
{
//更新连接状态
if (currentInterface != null)
{
IPv4InterfaceStatistics tempInterStat = currentInterface.GetIPv4Statistics();
SetSendedInfo((((double)tempInterStat.BytesSent) / 1024).ToString(".##"));
SetReceivedInfo((((double)tempInterStat.BytesReceived) / 1024).ToString(".##"));
}
}
在最下面的timer1_Tick是一个计数器。Timer不会引发异常,但在更新的时候好像有点问题。多线程的代码刚让我给删除了。呵呵,不过,意思也就是这样。