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并等待一下。