2009-10-28 26 views
15

Aşağıdaki kod bölümü ile sorun yaşıyorsanız. Bir parametre sayısı uyuşmazlığı alıyorum.Parametre Sayımı Uyumsuzluk

Birden çok iş parçacığı ve güvenli olmayan güncelleştirmeyle ilgili sorunlar nedeniyle bunu yazmak zorunda kaldım.


 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

hata hattı ile neden olup ]}); – BSchlinker

cevap

16

hata bu hattan geliyor sanırım:

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

Sen del (tokens[1]) için yalnızca bir parametre geçirmek ama iki parametre (gönderen ve e)

sahiptir DÜZENLEME: kodunuzu dikkatlice okuduktan sonra, label_sensorValue değerini ayarlamak için bir SetSensorValue yöntemi oluşturmanızı öneririm. Şu anda, olay işleyicisini yanlış parametrelerle çağırmaya çalışıyorsunuz.

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

Sorununuz, yalnızca bir parametreyle iki parametreli bir temsilci çağırmanızdır.

aşağıdaki satırı

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

parametre tokens[1] UI parçacığı üzerinde temsilci çağırır.

Temsilci iki parametre gerektirdiğinden başarısız oluyor. Buna ek olarak, delege bir dize değil, bir object ve SerialDataReceivedEventArgs bekler.

Bunu düzeltmek için delege yerine anonim bir yöntem çağırmalısınız.

Örneğin, (C# 3): label_sensorValue.Invoke (del, yeni bir nesne [] {belirteçleri [1: (C# hata ayıklayıcı göre)

label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1]));