gpt4 book ai didi

c# - 我如何确保任何线程都不会无限期地等待?

转载 作者:太空宇宙 更新时间:2023-11-03 20:15:10 27 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

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

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

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

编辑:

Parallel.ForEach(db.Records, ProcessRecord);

是的。 :)

进一步编辑:

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

关于c# - 我如何确保任何线程都不会无限期地等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17356894/

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