C# 异步方法引发异常

C# 异步方法引发异常,c#,.net,multithreading,asynchronous,task,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

我目前在一个抛出异常的方法上遇到了一些问题,但我不知道为什么。这个异常使我的应用程序崩溃

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()
引发异常的方法如下所示:

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);
    }
}
它从列表中获取传入消息并过滤掉用户名和消息以将其发送到Process方法。如果有人能帮我,我将不胜感激


注意:在Windows R2 2008服务器上运行时,该异常大约每天发生一次。因此,我无法在Visual Studio中真正调试它,因为您使用的是
异步void
方法,所以您会看到该异常会使进程崩溃

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

private async Task ToReadAsync()

Task listenerTask = Task.Run(() => ToReadAsync());
现在,您可以在
listenerTask.exception
中很好地检索异常。但它可能不会给你更多的细节


可能发生的情况是,您的
toRead
变量在某个点被设置为
null
。现行准则的整个概念是错误的;这样的轮询绝对不是将数据从一个线程发送到另一个线程的方式。查看
BlockingCollection
或类似的方法以获得正确的方法。

您看到异常会使您的进程崩溃,因为您使用的是
async void
方法

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

private async Task ToReadAsync()

Task listenerTask = Task.Run(() => ToReadAsync());
现在,您可以在
listenerTask.exception
中很好地检索异常。但它可能不会给你更多的细节


可能发生的情况是,您的
toRead
变量在某个点被设置为
null
。现行准则的整个概念是错误的;这样的轮询绝对不是将数据从一个线程发送到另一个线程的方式。查看
BlockingCollection
或类似的内容,了解正确的方法。

调试程序。它在哪里坠毁?找出什么是空的。您做过任何调查吗?为什么要线程化
async
方法?让它返回一个
任务
,然后你就可以
等待它了。正如Daniel提到的,你的ToRead()只是另一个线程。所以看看async并等待一点。调试程序。它在哪里坠毁?找出什么是空的。您做过任何调查吗?为什么要线程化
async
方法?让它返回一个
任务
,然后你就可以
等待它了。正如Daniel提到的,你的ToRead()只是另一个线程。所以看看async并等待一下。