2013-11-15 3 views
0

У меня есть этот оператор кода, и я запускаю его в таймер, его интервал составляет 50 мс. После того, как thread1 работал, мой связанный список (данные) равен Read_Data3. Затем я проверяю это условие if (data.ElementAt(0) == Convert.ToByte('$')). Однако при этом появляется сообщение об ошибке «Значение не может быть нулевым». Я проверил, что массивы и связанные списки не пустые. В чем причина этой ошибки? Есть идеи?C# LinkedList Значение не может быть равно

thread1 = new Thread(delegate() 
{ 
    Read_Data2 = Read_Data1; 
    lastCount = count; 
    division = lastCount/18; 
    remaning = (lastCount - 18 * division); 

    Read_Data3 = new byte[lastCount - remaning]; 

    for (int i = 0; i < lastCount - remaning; i++) 
    { 
     Read_Data3[i] = Read_Data2[i]; 
    } 
    if (remaning > 0) 
    { 
     Read_Data4 = new byte[remaning]; 
     for (int i = 0; i < remaning; i++) 
     { 
      Read_Data4[i] = Read_Data2[lastCount - remaning + i]; 
     } 
    } 
    count = remaning; 
    if (lastCount - remaning > 17) 
    data = new LinkedList<byte>(Read_Data3); 
}); 
    thread1.Start(); 

if (data.ElementAt(0) == Convert.ToByte('$')) 
{ 
    for (int i = 0; i < (lastCount - remaning)/18; i++) 
    { 
     //time = new XDate(DateTime.Now); 
     if (data.ElementAt(0) == Convert.ToByte('$')) 
     { 
      data.Remove(data.ElementAt(0)); 
      for (int x = 0; x < 16; x++) 
      { 
       listAuido.Add(time, data.ElementAt(0)); 
       data.Remove(data.ElementAt(0)); 
      } 
      listPulse.Add(time, data.ElementAt(0)); 
      data.Remove(data.ElementAt(0)); 
     } 
     zgcMasterPane.AxisChange(); 
    } 
    if (remaning > 0) 
    { 
     data2 = new LinkedList<byte>(Read_Data4); 
     data2.Remove(data2.ElementAt(0)); 
     time = new XDate(DateTime.Now); 
     for (int i = 0; i < remaning - 2; i++) 
     { 
      listAuido.Add(time, data2.ElementAt(0)); 
      data2.Remove(data2.ElementAt(0)); 
     } 
    } 
} 

ответ

1

Переменная data устанавливается в конце «метода потока».

data = new LinkedList<byte>(Read_Data3);//<--assigned here 

Но нить вызвать этот метод не будет ждать, пока thread1 отделки, так вы получите ArgumentNullException в следующую строку.

if (data.ElementAt(0) == Convert.ToByte('$')) 

Чтобы исправить это, вам, возможно, придется ждать, пока thread1 завершается.

thread1.Start(); 
thread1.Join(); 

Или просто переместите следующий код из этого оператора if внутри делегата потока.

Смежные вопросы