1

我正在编写一个多线程应用程序。这是我的情况。

我从数据库中抓取一千条记录。将其分成 5 块列表对象。并创建 5 个线程来处理它们。我每分钟都做同样的事情,直到我有记录留在数据库中

Task.Factory.StartNew(() => ProcessRecords(listRecords))

在 ProcessRecords 方法中,有一个小的数据库更新和一些发送邮件。(我将 System.Net.Mail 用于电子邮件,不使用任何 ORM 进行数据库操作。)

现在我担心由于一些未知问题,线程可能无法完成。在那种情况下会发生什么?假设一个进程(甚至更多)一直在等待数据库中的死锁或其他什么,我的应用程序会发生什么。它将继续添加具有新记录集的新线程,而一些永无止境的线程。在这种情况下如何实现超时?

我想运行这个过程,如果它无法完成,则在 5 分钟内终止它。

4

1 回答 1

5

查看称为 TaskCancellationToken 的东西。如果您决定(通过您喜欢的任何方式)它运行时间过长,您可以使用它来终止任务。

或者,您可以将其构建到 ProcessRecords() 方法本身中:如果运行时间过长,只需让它提交 seppuku,方法是让它跟踪自己的开始时间并不时检查经过的时间;可以更简单。

也就是说,如果您还没有尝试过,您可以检查一下 .AsParallel() 是否会在这里为您省去一些麻烦。在很多情况下,您可以将并行化问题完全留给编译器。

Parallel.ForEach(db.Records, r => ProcessRecord(r));

编辑:

Parallel.ForEach(db.Records, ProcessRecord);

是的。:)

进一步编辑:

对于 OP,不,TaskFactory 不提供开箱即用的任何东西。如果你想从进程外部终止进程,你需要使用某种观察线程来滚动你自己的机制来跟踪你正在运行的任务,它们已经运行了多长时间,以及它们各自的取消令牌(或者可能只是你在 while 循环顶部拥有的一个布尔值......)。

于 2013-06-28T03:59:35.090 回答