2009-10-28 46 views
15

Gặp sự cố với đoạn mã sau. Tôi nhận được một số thông số không khớp.Số thông số không khớp

Tôi đã phải viết điều này vì các vấn đề với nhiều luồng và cập nhật không an toàn.


 delegate void data_INPUTDelegate(object sender, System.IO.Ports.SerialDataReceivedEventArgs e); 
    private void data_INPUT(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 
     string data = serialPort.ReadLine(); 

     string[] tokens = data.Split(':'); 
     if (tokens[0] == "$SENSOR") 
     { 
      if (label_sensorValue.InvokeRequired) 
      { 
       data_INPUTDelegate del = new data_INPUTDelegate(data_INPUT); 
       label_sensorValue.Invoke(del,new object[] {tokens[1]}); 
      } 
      else 
      { 
       label_sensorValue.Text = tokens[1]; 
      } 
     } 
    } 
+0

Các lỗi (theo C# debugger) đang được gây ra bởi dòng: label_sensorValue.Invoke (del, đối tượng mới [] {thẻ [1 ]}); – BSchlinker

Trả lời

16

Tôi đoán lỗi xuất phát từ dòng này:

label_sensorValue.Invoke(del,new object[] {tokens[1]}); 

Bạn vượt qua chỉ có một tham số để del (tokens[1]) nhưng nó có hai tham số (người gửi và e)

EDIT: sau khi đọc kỹ mã của bạn, tôi khuyên bạn nên tạo phương thức SetSensorValue để đặt giá trị là label_sensorValue. Ngay bây giờ bạn đang cố gắng gọi trình xử lý sự kiện với các tham số sai.

private void data_INPUT(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    string data = serialPort.ReadLine(); 

    string[] tokens = data.Split(':'); 
    if (tokens[0] == "$SENSOR") 
    { 
     SetSensorValue(tokens[1]); 
    } 
} 

delegate void SetSensorValueDelegate(string value); 

private void SetSensorValue(string value) 
{ 
    if (label_sensorValue.InvokeRequired) 
    { 
     SetSensorValueDelegate del = new SetSensorValueDelegate(SetSensorValue); 
     label_sensorValue.Invoke(del, new object[] {value}); 
    } 
    else 
    { 
     label_sensorValue.Text = value; 
    } 
} 
4

Vấn đề của bạn là bạn đang gọi đại biểu hai tham số chỉ với một tham số.

Các dòng sau

label_sensorValue.Invoke(del,new object[] {tokens[1]}); 

gọi các đại biểu trên thread UI với tham số tokens[1].

Vì đại biểu yêu cầu hai tham số, nó không thành công. Ngoài ra, đại biểu mong đợi một số objectSerialDataReceivedEventArgs, không phải là một chuỗi.

Để khắc phục điều này, bạn nên gọi một phương thức ẩn danh thay vì ủy nhiệm.

Ví dụ (trong C# 3):

label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1])); 
Các vấn đề liên quan