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时异常所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)