许多线程调用相同的函数,只有一个应该成功

时间:2015-12-03 06:09:26

标签: c# multithreading thread-safety

我有一个函数(Shutdown()),它用于终止我的窗体(做一些清理并在最后调用this.close())。

在我的应用程序中,我有执行线程

  • 用户界面
  • 后台工作者
  • 计时器

这些中的每一个都可以通过用户按下按钮(UI),计时器到期(计时器)或后台工作人员完成他的任务来调用Shutdown()。这让我担心如果时间非常糟糕,我可以让多个线程同时调用Shutdown()。

那么我怎样才能确保只有第一个调用它的人才会执行它?任何后续调用都应该被忽略,因为无论如何调用将以终止应用程序结束。

1 个答案:

答案 0 :(得分:1)

从你的问题中我不清楚困难是什么。你有什么尝试?你遇到了什么麻烦?

明显的,微不足道的实现将是这样的:

private readonly object _lock = new object();
private bool _shuttingDown;

public void Shutdown()
{
    lock (_lock)
    {
        if (_shuttingDown) return;

        _shuttingDown = true;
    }

    // do work here...
}

是否有某些原因在您的方案中无效?如果是这样,请提供a good, minimal, complete code example,清楚地显示您尝试过的内容,准确描述代码的作用以及与您希望的内容有何不同。