gpt4 book ai didi

.net - Windows 服务、blockingcollection 和多线程的问题

转载 作者:行者123 更新时间:2023-12-01 12:59:06 26 4
gpt4 key购买 nike

我的场景:

  • Windows 服务 .NET 4
  • 我轮询数据库中的实体。
  • 当新实体进来时,它们被添加到 BlockingCollection
  • 在服务的 OnStart 中,我创建了一个 System.Threading.Tasks.Task,它的工作是枚举 BlockingCollection(使用 GetConsumingEnumerable()).

我遇到的问题是:

  • 当任务中发生未处理的异常时,我希望记录异常并停止服务。
  • 除非调用 Task.Wait(),否则我无法从任务中捕获异常。
  • 如果我调用 Task.Wait()OnStart 方法会阻塞并且服务永远不会完成启动。

那么我怎样才能让它发挥作用呢?

最佳答案

您可以使用“.ContinueWith”方法处理任务中的异常:

Task.Factory.StartNew(() => {

// Do some long action
Thread.SpinWait(5000000);

// that eventually has an error :-(
throw new Exception("Something really bad happened in the task.");

// I'm not sure how much `TaskCreationOptions.LongRunning` helps, but it sounds
// like it makes sense to use it in your situation.
}, TaskCreationOptions.LongRunning).ContinueWith(task => {

var exception = task.Exception;

/* Log the exception */

}, TaskContinuationOptions.OnlyOnFaulted); // Only run the continuation if there was an error in the original task.

关于.net - Windows 服务、blockingcollection 和多线程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7770291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com