使用长时间运行的后台消费者任务时Task.Factory.StartNew中的静默异常?这通知未处理的异常:newThread(_=>{thrownewException();}).Start();这不会(至少在您等待/检索结果之前):Task.Factory.StartNew(()=>{thrownewException();});为什么?发生异常的线程怎么了?isitdead这是运行任务但不需要其结果或需要等待它的问题,就像这样:_operationQueue=newBlockingCollection();Task.Factory.StartNew(()=>{foreach(varitemin_operationQueue.GetConsumingEnumerable()){//做一些抛出的事情}},TaskCreationOptions.LongRunning);在这种情况下,_operationQueue是什么状态?我知道我可以将Continition与TaskContinuationOptions.OnlyOnFaulted一起使用,您可以继续吗?那么,你认为应该发生什么?你认为每当另一个线程抛出异常时,它应该立即传播到启动任务的线程吗?我坚决不同意。首先,调用线程中的代码将在中途被迫中止其操作,这很可能会导致严重的问题。只需查看有关Thread.Abort的所有帖子,即可了解当您允许在程序执行中的某个任意点而不是某个已知点抛出异常时出现的所有非常重要的问题。如果您建议当任务代码抛出异常时整个程序崩溃,那么我会说这根本不可取。在极少数情况下,如果任务失败,您可以(非常容易地)在继续整个过程的任务上创建一个延续。我还不需要自己创建这样的延续。如果系统设计为在任务抛出异常时关闭进程,那么要获得相反的行为就不那么容易了。发生异常的线程怎么了?是不是死了如果异常被捕获,捕获后继续执行;如果它通过整个调用堆栈传播,异常将被包装异常并使其可用于继续的任务框架内的代码捕获。在这种情况下,_operationQueue处于什么状态?这是一个完美的队列,1..N项已从中删除。如果循环体总是抛出异常,那么就会从中取出一个项目。如果它只是偶尔抛出,那么一些物品就会从它身上拿走。其余项目仍在队列中,可以被任何其他具有访问权限的线程删除。如果队列不再可达,则它有资格进行垃圾回收。我知道我可以将Continition与TaskContinuationOptions.OnlyOnFaulted一起使用,您可以继续吗?调用线程可以;当然。任务本身只能通过在其委托中使用try/catch来继续。如果异常被抛出到任务出错的程度,则没有任何东西可以让任务继续执行。任务中的异常由TaskScheduler捕获。TaskScheduler.UnobservedTaskException如果您不想观察任务的结果,但希望收到有关任务中未处理的异常的通知,则会发生事件。请注意,此事件不会立即触发,但如果从未检索到异常,则会在任务完成时触发。在.Net4中,UnobservedTask异常被重新抛出并成为结束进程的未处理异常,但在.Net4.5中发生了变化。以上是C#学习教程:SilentexceptioninTask.Factory.StartNewwhenusinglong-runningbackgroundconsumertasks?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
