c# – 运行System.Threading.Tasks.Task时异常

c# – 运行System.Threading.Tasks.Task时异常,第1张

概述请考虑以下使用CancellationTokenSource的基本任务库功能的代码.它启动一个线程,它填充一个字典的价格,并从SQL Server数据库读取数据.线程在大约10分钟后结束,每2个小时再次启动,首先调用Cancel,以防线程仍在运行. private CancellationTokenSource mTokenSource = new CancellationTokenSource( 请考虑以下使用CancellationTokenSource的基本任务库功能的代码.它启动一个线程,它填充一个字典的价格,并从sql Server数据库读取数据.线程在大约10分钟后结束,每2个小时再次启动,首先调用Cancel,以防线程仍在运行.
private CancellationTokenSource mTokenSource = new CancellationTokenSource();internal Prices(Dictionary<string,Dealer> dealers){    mDealers = dealers;    mTask = Task.Factory.StartNew            (() => ReadPrices(mTokenSource.Token),mTokenSource.Token);}internal voID Cancel() {    mTokenSource.Cancel();}private voID ReadPrices(CancellationToken ct) {     using (sqlConnection connection =             new   sqlConnection(ConfigurationManager.AppSettings["DB"]))        {         connection.open();         var dealerIDs = from dealer in mDealers.Values                          where dealer.ID != null                          select dealer.ID;         foreach (var dealerID in dealerIDs)          {             if (!ct.IsCancellationRequested)             {                 FillPrices(connection);             }             else                break;        }    }}

在某些时候,应用程序在事件日志中遇到以下异常.

Application: Engine.exe Framework Version: v4.0.30319 Description: The
process was terminated due to an unhandled exception. Exception Info:
System.AggregateException Stack: at
System.Threading.Tasks.TaskExceptionHolder.Finalize()

它必须与这里的代码有关,因为任务库不会在其他任何地方使用,但我不能弄清楚代码是什么问题.有人有什么想法吗?

解决方法 任务喜欢听的.这听起来好像不快乐.尽管如此,您可以获得“最后的机会”:
TaskScheduler.UnobservedTaskException += (sender,args) =>{    foreach (var ex in args.Exception.InnerExceptions)    {        Log(ex);    }                args.Setobserved();};

请注意,这不是解决方案 – 它的目的是让您看到任务正在爆炸以及出现什么错误. Setobserved()将阻止它杀死您的应用程序.但这里的解决方案是理想的:

>不要让你的任务抛出,
>或者确保你在那里检查任务的状态

您的取消检测可能不太满意. IIRC的首选方法是:

foreach(...) {    if(ct.IsCancellationRequested) {        // any cleanup etc        ct.ThrowIfCancellationRequested();    }     ...}

或者更简单,如果不需要清理,只需:

foreach(...) {    ct.ThrowIfCancellationRequested();    ...}

同样地,它可能只是一个数据访问异常.在与数据库通信时可能会发生任何数量的异常.超时,死锁,无法连接等

总结

以上是内存溢出为你收集整理的c# – 运行System.Threading.Tasks.Task时异常全部内容,希望文章能够帮你解决c# – 运行System.Threading.Tasks.Task时异常所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236357.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存