2012-10-11 16 views
6

Tôi có một mô-đun whith một sự kiện cho cổng nối tiếp sygnalCross-chủ đề hoạt động không hợp lệ (Làm thế nào để truy cập vào các yếu tố WinForm từ một sự kiện mô-đun?)

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

nơi DataReceived là

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

và ProcessData đang gọi phương thức 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() + " "; 

nhưng khi nó đang cố gắng truy cập vào TextBox1 tôi nhận được:

Cross-chủ đề hoạt động không hợp lệ: Control 'TextBox1' truy cập từ một thread khác với thread nó đã được tạo ra về.

Vì vậy, câu hỏi là cách truy cập phần tử WinForm từ một sự kiện mô-đun khác?

+1

lẽ MethodInvoker? – Zenwalker

Trả lời

13

Bạn cần sử dụng trình điều phối biểu mẫu.

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

Điều này làm cho mã đó chạy trong chuỗi biểu mẫu thay vì của bạn.

+1

Sau đó, bạn cần phải làm cho mã của bạn nâng cao một sự kiện mà biểu mẫu có thể nghe và sau đó thực hiện cuộc gọi. Mô-đun của bạn không nên cố thay đổi thuộc tính trên biểu mẫu trực tiếp. – PhonicUK

+0

cảm ơn bạn! hoạt động tốt – Cynede

8

hãy thử sử dụng dưới đây Code:

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

hy vọng điều này giúp

Các vấn đề liên quan