gpt4 book ai didi

c# - 如何确保线程任务运行

转载 作者:太空宇宙 更新时间:2023-11-03 11:16:36 25 4
gpt4 key购买 nike

不是特定语言,但我在 C# 中有这个:

public static void StartJob() {
ThreadPool.QueueUserWorkItem(s => {
if (Monitor.TryEnter(_lock)) {
ProcessRows();
Monitor.Exit(_lock);
}
}
);

ProcessRows() 处理并删除数据库中的行,直到删除所有行。在程序启动时,无论何时在程序的其他地方向数据库添加一行,都会调用 StartJob,以确保在不阻塞程序的情况下处理所有行。现在,如果在 StartJob 即将释放锁的同时添加一行,则不会对其进行处理。

如何确保所有行都得到处理?除非添加行,否则我不希望运行 ProcessRows()

最佳答案

不要锁定方法;使用表明您是否正在运行的标志锁定方法。

一个实现可能类似于下面的代码 - 在这种情况下,我已将所有逻辑移至 ProcessRows 并使该方法在已运行时立即返回。

public static bool _isRunning = false;

public static void StartJob()
{
ThreadPool.QueueUserWorkItem(s => { ProcessRows(); })
}

public static void ProcessRows()
{
Monitor.Enter(_lock);
if (_isRunning)
{
Monitor.Exit(_lock);
return;
}

_isRunning = true;

while (rowsToProcess)
{
Monitor.Exit(_lock);;

// ... do your stuff

Monitor.Enter(_lock);
}

_isRunning = false;
Monitor.Exit(_lock);
}

使用这种结构,如果不设置 _isRunning = false 就不可能完成 while 循环 - 如果不是这种情况,就会出现竞争条件循环完成,就像该方法的另一个实例开始一样。同样,当方法被调用时,它总是会进入循环并在另一个实例有机会执行之前设置 _isRunning = true

关于c# - 如何确保线程任务运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12496750/

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