【发布时间】:2011-02-23 06:40:40
【问题描述】:
我有一些我写的代码,它可以满足我的需求。但是,我不太确定它究竟是如何工作的。我最麻烦的部分是最后一部分。我有一个 textBox1.Text = "test" 不起作用。我收到一个运行时错误,它是从不同的线程调用的。当我放置 textBox1.Invoke(等)时,它按预期工作。为什么?
如您所见,我知道这足以造成危险,我真的想了解这里发生了什么,而不是盲目地从网络上的网站复制和粘贴。
我在名为 SerialCommunicator 的类中有以下内容:
public SerialCommunicator(SerialPort sp)
{
this.sp = sp;
sp.ReceivedBytesThreshold = packetSize;
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
sp.Open();
}
public void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(50);
SerialPort s = (SerialPort)sender;
byte[] buffer = new byte[128];
s.Read(buffer, 0, s.BytesToRead);
}
然后,在我的 Form1.cs 中,我有一个按钮,按下时会执行以下操作:
private void btnPortOK_Click(object sender, EventArgs e)
{
string comPort = cboComPorts.SelectedItem.ToString();
SerialPort sp = new SerialPort(comPort, 9600, Parity.None, 8, StopBits.One);
sp.DataReceived += new SerialDataReceivedEventHandler(DataHasBeenReceived);
comm = new SerialCommunicator(sp);
}
public void DataHasBeenReceived(object sender, EventArgs args)
{
textBox1.Invoke(new EventHandler(delegate { textBox1.Text += "test"; }));
}
【问题讨论】:
标签: c# .net multithreading delegates invoke