2009-10-28 10 views
15

Problem z następującym fragmentem kodu. Dostaję niezgodność liczby parametrów.Niezgodność liczby parametrów

Musiałem to napisać z powodu problemów z wieloma wątkami i niebezpiecznych aktualizacji.


 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

Błąd (zgodnie C# debugera) jest spowodowana przez linię: label_sensorValue.Invoke (DEL, nowy obiekt [] {tokenów [1 ]}); – BSchlinker

Odpowiedz

16

Myślę, że błąd pochodzi z tej linii:

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

zdać tylko jeden parametr del (tokens[1]), ale ma dwa parametry (nadawcę oraz e)

EDYCJA: po uważnym przeczytaniu kodu, sugeruję utworzenie metody SetSensorValue, aby ustawić wartość label_sensorValue. W tej chwili próbujesz wywołać procedurę obsługi zdarzeń o niepoprawnych parametrach.

4

Twój problem polega na tym, że wywołujesz delegat z dwoma parametrami z jednym parametrem.

Ta linia

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

wywołuje pełnomocnika do gwintu interfejsu z parametrem tokens[1].

Ponieważ delegat wymaga dwóch parametrów, nie działa. Ponadto, delegat oczekuje, że object i SerialDataReceivedEventArgs, a nie ciąg.

Aby to naprawić, należy wywołać metodę anonimową zamiast delegata.

na przykład (C# 3)

label_sensorValue.Invoke(new Action(() => label_sensorValue.Text = tokens[1])); 
Powiązane problemy