异步方法抛出exception

我目前在使用抛出exception的方法时遇到了一些问题,但我不确定原因。 该exception使我的应用程序崩溃。

System.NullReferenceException: Object reference not set to an instance of an object. at Myapp.AutoProcess.d__36.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.AsyncMethodBuilderCore.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(); 

抛出exception的方法如下所示:

 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); } } 

它接收来自List的传入消息,并过滤掉Username和Message以将其发送到Process方法。 如果有人能帮助我,我将不胜感激。

注意:exception发生在Windows R2 2008 Server上每天运行一次。 因此我无法在Visual Studio中进行调试

您看到该exception会导致您的进程崩溃,因为您正在使用async void方法。

而不是使用线程,使用任务,如下:

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

现在,您将能够在listenerTask.Exception很好地检索exception。 但它可能不会给你更多的细节。

可能发生的是你的toRead变量在某些时候被设置为null 。 当前代码的整个概念是错误的; 这样的轮询绝对不是将数据从一个线程发送到另一个线程的方式。 检查BlockingCollection或类似的东西,以获得正确的方法。