1

我有一个关键部分,它只执行一次,但被许多场景调用。如何执行此线程过程并跳过所有其余调用?

提前致谢。

4

5 回答 5

5
// Assuming this uses calls from multiple threads, I used volatile.
volatile bool executed = false;
object lockExcecuted = new object();

void DoSomething()
{
    lock (lockExecuted)
    {
        if (executed) return;
        executed = true;
    }
    // do something
}
于 2012-05-15T15:43:41.110 回答
1
public static bool hasExecuted = false;

static readonly object lockObject = new object();

static void Method()
{
    lock(lockObject)
    {
        if(!hasExecuted)
        {
            // run code
            hasExecuted = true;
        }
    }
}
于 2012-05-15T15:46:53.833 回答
0

锁定是首选方法;除非你有更详细的要求。

编辑:添加“仅一次”意味着锁定不足。

于 2012-05-15T15:43:20.590 回答
0

用于lock仅允许一个线程访问关键部分,并在完成时设置一个标志,表示已完成。

于 2012-05-15T15:44:11.233 回答
0

取决于你的场景。如果此部分返回一个值,您可以使用 .Net 4.0 的新功能 - Lazy(T)

当然,您总是可以在您的关键部分中设置一个标志,并在执行之前检查它的值(这有时在使用单例模式时完成)

于 2012-05-15T15:46:58.363 回答