2014-01-30 2 views
-2

У меня в настоящее время возникают проблемы с методом, который генерирует исключение, но я не уверен, почему. Исключение делает мое приложение аварийным.Async Method throws Exception

System.NullReferenceException: Object reference not set to an instance of an object. 
    at Myapp.AutoProcess.<ToRead>d__36.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__1(Object state) 
    at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 
    at System.Threading.ThreadPoolWorkQueue.Dispatch() 
    at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() 

бегает метод в отдельном потоке

Thread listenerThread = new Thread(() => ToRead()); 
listenerThread.Start(); 

Метод, который бросает исключение выглядит следующим образом:

private async void ToRead() 
{ 
    while (true) 
    { 
     if (this.toRead.Count != 0) 
     { 
      string protocol = this.toRead[0]; 
      string[] temp = protocol.Split(','); 
      string message = temp[0]; 
      string UserName = temp[1]; 
      Process(message, UserName); 
      this.toRead.RemoveAt(0); 
     } 
     await Task.Delay(200); 
    } 
} 

Он принимает входящие сообщения из списка и отфильтровывает Username и Message, чтобы отправить его методу Process. Буду признателен, если кто-нибудь сможет мне помочь.

Примечание. Исключение происходит примерно раз в день, запуская его на сервере Windows R2 2008 Server. Поэтому я не могу отладить его в Visual Studio

+1

Отладка программы. Где он падает? Узнайте, что было нулевым. Вы проводили какое-либо расследование? – usr

+3

Почему вы используете метод async? Заставьте его вернуть «Задачу», а затем вы можете «ждать» ее. –

+0

Так же, как Даниэль упомянул, что ваш ToRead() - это просто другой поток. Посмотрите на асинхронный процесс и подождите немного. – loop

ответ

9

Вы видите, что исключение разбило ваш процесс, потому что вы используете метод async void.

Вместо того, чтобы использовать нить, использовать задачу как таковую:

private async Task ToReadAsync() 

Task listenerTask = Task.Run(() => ToReadAsync()); 

И теперь вы сможете приятно получить исключение в listenerTask.Exception. Но это, вероятно, не даст вам больше подробностей.

Возможно, что ваша переменная toRead установлена ​​в null в какой-то момент. Вся концепция текущего кода неверна; Опрос, как это, наиболее определенно не способ отправки данных из одного потока в другой. Отъезд BlockingCollection или что-то в этом роде для правильного подхода.