异步方法抛出异常

时间:2014-01-30 20:08:52

标签: c# .net multithreading asynchronous task

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

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

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

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

1 个答案:

答案 0 :(得分:10)

您看到该异常导致您的流程崩溃,因为您使用的是async void方法。

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

private async Task ToReadAsync()

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

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

可能发生的事情是您的toRead变量在某个时刻设置为null。当前代码的整个概念是错误的;像这样的轮询绝对是将数据从一个线程发送到另一个线程的方式。查看BlockingCollection或类似的内容以获得正确的方法。