16

我有一个带有串行端口信号事件的模块

serialPort.DataReceived.AddHandler(SerialDataReceivedEventHandler(DataReceived));

DataReceived 在哪里

let DataReceived a b =
    rxstring <- serialPort.ReadExisting()
    arrayRead <- System.Text.Encoding.UTF8.GetBytes(rxstring)
    if arrayRead.[0] = 0x0Auy then
        ProcessData(a, null)

并且 ProcessData 正在调用 WinForms 方法

let ProcessData(a, b) =
    dataProcessor.Invoke(a, b) |> ignore

这是

private void ProcessData(object sender, EventArgs e) {
   byte[] m = Core.ncon.ArrayRead;
   switch (m[1]) {
      case 0x01: {
          if (m.Length > 5) {
             int myval = BitConverter.ToInt32(m, 3);
             textBox1.Text += " val: " + myval.ToString() + " ";

但是当它试图访问 textBox1 我得到:

跨线程操作无效:控件“textBox1”从创建它的线程以外的线程访问。

所以问题是如何从另一个模块事件中访问 WinForm 元素?

4

2 回答 2

29

您需要使用表单调度程序。

FormContaingTheTextbox.Invoke(new MethodInvoker(delegate(){
    textBox1.Text += " val: " + myval.ToString() + " ";
}));

这使得该代码在表单线程而不是您的线程中运行。

于 2012-10-11T10:23:43.560 回答
18

尝试使用以下代码:

this.Invoke(new MethodInvoker(delegate() 
{ 
//Access your controls
}));

希望这可以帮助

于 2012-10-11T10:23:47.733 回答