【发布时间】:2016-02-24 00:52:32
【问题描述】:
我想运行一个可能会运行几秒钟的清理任务。多个线程可以调用此任务,但我只想运行此任务一次。所有其他调用都应该跳过。
以下是我当前的实现,但我无法想象 .net 框架中没有更好的解决方案,从而减少代码行数。
object taskLock;
bool isRunning;
void Task()
{
if (isRunning) return;
try
{
lock (taskLock)
{
if (isRunning) return;
isRunning = true;
}
// Perform the magic
}
finally
{
isRunning = false;
}
}
【问题讨论】:
-
您可以使用类似的方法,但使用并发字典代替 taskLock 对象。 tbh - 如果它目前有效,请继续并分解积压中的其他项目
-
"我无法想象没有更好的解决方案" 这是一个非正统的问题,因为根据定义它充满了并发歧义。根据时间的不同,任务可能只运行一次 - 或针对每个调用线程。至少,它是低效的。
-
是的,它可能非常低效,但我没有看到更好的替代信号来发出特定任务的信号。另一种方法可能是使用重置事件,其中任务只是等待直到另一个线程设置事件,但我必须管理一个线程/任务。
标签: c# multithreading synchronization locking nonblocking