正是我正在做的正确/最好的方式来完成这一点?正确的方式做任务同步?
我有一个带定时器的窗口。每次计时器滴答时,我都会调用下面显示的RunTask
方法。在RunTask
内,我拨打DoTheThing
。 DoTheThing
可能需要一段时间才能运行,并且可能会失败(这是数据库更新)。我想确保在任何时候,我只有一个优秀的DoTheThing
。我还想确保我没有一排排队的RunTask
实例,并且正在等待运行DoTheThing
的RunTask
实例释放一个锁。
public void RunTask()
{
bool canRunTask = true;
// Check if another instance of this method is currently executing. If so, do not execute the rest of this method
lock (this.runTaskLock)
{
if (this.isTaskRunning)
{
canRunTask = false;
}
else
{
this.isTaskRunning = true;
}
}
// Call DoTheThing if another instance is not currently outstanding
if (canRunTask)
{
try
{
Task task = new Task(() => DoTheThing());
task.Start();
}
catch (Exception ex)
{
// Handle the exception
}
finally
{
lock (this.runTaskLock)
{
this.isTaskRunning = false;
}
}
}
}
由于程序的架构,我宁愿把我所有的线程同步的这种方法,而不是启用和禁用计时器内。
当任务运行5秒钟,第一次运行将在第二次,第二次将在第二次15.我认为OP希望第一次运行在0和第二次在10(或如果该任务在0和20处需要15秒)。你可以使用Task.Whenall而不是2个独立的等待来实现这个结果。 – wertzui
@wertzui如果OP更喜欢你对时间的解释,我在代码中添加了一些注释来演示替代方案。 – spender