网上看了很多 都是说task创建了一个任务,需在任务最后通过CancellationTokenSource调用订阅服务区关闭程序
但是在本人开发期间,并未调用Task,仍然出现此报错,且报错是偶发的。
后面我在
stackoverflow
上找到可能的原因 希望帮到大家
这里大概描述一下
在里面NET Framework 4.7.1和早期版本,WPF可能会创建一个系统。Windows。线程。上的调度程序。NET终结器线程。这是在中修复的。NET Framework 4.7.2及更高版本,使弱事件的清理具有线程意识。因此,WPF可能会调用System。Windows。线程。调度员。调用以完成清理过程。
在某些应用程序中,终结器定时的这种变化可能会在AppDomain或进程关闭期间导致异常。这通常出现在应用程序中,这些应用程序在进程或AppDomain关闭之前没有正确关闭工作线程上运行的调度程序。这样的应用程序应该注意正确地管理调度器的生命周期。
在里面NET Framework 4.7.2及更高版本,开发人员可以禁用此修复程序,以帮助缓解(但不是消除)由于清理更改可能出现的时间问题。
若要禁用清除中的更改,请使用以下AppContext标志。
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotInvokeInWeakEventTableShutdownListener=true"/>
</runtime>
</configuration>
Exception: System.AggregateException: 发生一个或多个错误。 ---> System.Threading.Tasks.TaskCanceledException: 已取消一个任务。
System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(System.Net.Http.HttpRequestMessa
在我的主程序中,需要处理
一个不确定费时多久的工作(有可能1ms完成,也有可能50s,但是是一段顺序执行的代码,只跑一轮,没有循环),我希望当这个工作执行超过一定时间(例如3s)之后,就被停止。
我把这个工作放到business类的Hardwork()方法中去做,并被主程序调用。
static void Main(str
ing[] args)
本篇的内容也很重要,因为涉及到了日常经常会碰到的
取消任务操作。
从我个人了解到的情况,基本上大家都采用Can
cellationTokenSour
ce方法来
取消任务,因此这里就举几个简单的例子。例子依然是来自于《
C#多线程编程实战》。
private static int
TaskMethod(str
ing name, int seconds, Can
cellationToken token)
异常详细报错:关闭程序时出现的异常。
引发的异常:“System.Threading.Tasks.TaskCanceledException”(位于 mscorlib.dll 中)
引发的异常:“System.TimeoutException”(位于 WindowsBase.dll 中)
原因:使用Environment.Exit(0)强制关闭程序;
解决方式:不要使用Environm...
最好的参考文档莫过于直接参看Thread 类,由于在.net 中,代码是未开源的,但是我们也是可以通过该类让我们获取一定的信息去使用该类。
例如初始化Thread实例:
public Thread(ThreadStart start);
[ComVisible(true)]
public delegate void ThreadStart(...
us
ing System.Collections.Generic;
us
ing System.
Threading;
us
ing System.
Threading.
Tasks;
public class Example
public static void Main()
// Define the can
cellation t
CancellationTokenSource这个是取消的发送信号,CancellationTokenSource每次传入Task.Run的时候必须是新的对象,不能是已经被调用了CancellationTokenSource.Cancle(true)了的,不然Task.Run不会启动
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;