我目前在使用抛出异常的方法时遇到了一些问题,但我不确定原因。该异常使我的应用程序崩溃。
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中进行调试
答案 0 :(得分:10)
您看到该异常导致您的流程崩溃,因为您使用的是async void
方法。
使用任务,而不是使用线程:
private async Task ToReadAsync()
Task listenerTask = Task.Run(() => ToReadAsync());
现在,您将能够在listenerTask.Exception
中很好地检索异常。但它可能不会给你更多细节。
可能发生的事情是您的toRead
变量在某个时刻设置为null
。当前代码的整个概念是错误的;像这样的轮询绝对是不将数据从一个线程发送到另一个线程的方式。查看BlockingCollection
或类似的内容以获得正确的方法。