Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Threading.ThreadAbortException在新线程中激发_C#_C# 4.0_Task Parallel Library_Parallel Extensions_Taskfactory - Fatal编程技术网

C# System.Threading.ThreadAbortException在新线程中激发

C# System.Threading.ThreadAbortException在新线程中激发,c#,c#-4.0,task-parallel-library,parallel-extensions,taskfactory,C#,C# 4.0,Task Parallel Library,Parallel Extensions,Taskfactory,我目前在.NETC#4.0中工作,在我编写的一些代码中遇到了一个问题,这让我有些头疼 我正在将System.Threading.Tasks.TaskFactory类与System.Threading.Tasks.TaskScheduler结合使用,以在控制台应用程序中启动一个新线程,该线程的功能是检查项目是否已添加到队列中。将项目添加到队列时,它将对其进行处理 因此,队列包含要发送的电子邮件,一旦将电子邮件添加到队列中,电子邮件将通过多个客户端发送。发送到每个节点的过程是并行的 我有一个间歇性问

我目前在.NETC#4.0中工作,在我编写的一些代码中遇到了一个问题,这让我有些头疼

我正在将System.Threading.Tasks.TaskFactory类与System.Threading.Tasks.TaskScheduler结合使用,以在控制台应用程序中启动一个新线程,该线程的功能是检查项目是否已添加到队列中。将项目添加到队列时,它将对其进行处理

因此,队列包含要发送的电子邮件,一旦将电子邮件添加到队列中,电子邮件将通过多个客户端发送。发送到每个节点的过程是并行的

我有一个间歇性问题,在新线程中有时会发生以下异常:

[System.Threading.ThreadAbortException]={无法计算表达式,因为代码已优化或本机帧位于调用堆栈顶部。}

调试时,我无法获得任何进一步的信息,因为堆栈中的所有属性都具有“无法计算表达式,因为代码已优化或本机帧位于调用堆栈顶部。”

在internet上查找解决方案时,我发现这是在执行response.redirect时出现的问题,但我的代码中没有这样做。如果我尝试调试,那么这个错误发生的位置是不一致的。以下是我用来创建工厂和启动新线程的代码:

    this.taskFactory = new TaskFactory(TaskScheduler.Current);
    this.taskFactory.StartNew(this.DequeueMessage, state, TaskCreationOptions.LongRunning);

有没有人能告诉我为什么会出现此错误,以及如何修复此错误的提示?

获得
ThreadAbortException
的唯一原因是线程上调用了
Thread.Abort
。如果不手动执行此操作,则在客户端应用程序终止时,可能会发生这种情况。当东西被回收利用时,它也会发生在托管环境中。如果您提供更多详细信息,则可以提供更具体的答案。

您是否在web应用程序中创建任务?如果是这样,您可能会看到AppDomain被回收。解决方案是将后台线程移动到windows服务中。我在visual studio中运行的一个简单集成测试中看到了这种行为。当我在控制台应用程序中运行相同的代码时,也会看到相同的行为。我刚刚意识到,当我运行测试时,它会在代码完全执行之前完成,因此Thread.Abort。这可能吗?@是的,这正是正在发生的事情。在后台线程完成之前,测试过程已经存在。在测试中,您需要“等待”直到后台线程完成,然后退出测试。你可以用Task.Wait()来完成这个任务(StartNew返回一个任务对象)啊-真不敢相信我现在才明白!是你的回答让我思考!当我对返回的任务对象调用Wait方法时,任务似乎处于一种不做任何事情、不处理、只是处于空闲状态的状态。知道为什么会这样吗?@业余等待相当简单。如果任务已经在运行,Wait只是等待任务完成(即您的委托)。如果尚未运行,Wait会导致任务执行,然后等待任务完成。任务中没有固有的内容。等待会影响您的委托是否空闲