c#模拟Golang中的Once

#region COPYRIGHT(C)

/**************************************************************

 * PRODUCT  :   SCISE(R) COMBINE Framework For C#

 * COPYRIGHT:   2002 SCISE(R) NETWORKS. All Rights Reserved.

 * WEBSITE  :   http://www.scise.cn

 ***********************************************************/

#endregion

/// <summary>

///     在并发下保证Action只被执行一次

/// </summary>

/// <example>

/// <code>

/// var once = new Once();

/// once.Do(()=>{…}); //do

/// once.Do(()=>{…}); //not do

/// </code>

/// </example>

public class Once

{

    /// <summary>

    ///     标记变量

    /// </summary>

    private long _done = 0;

    /// <summary>

    /// 构造函数

    /// </summary>

    public Once()

    {

    }

    /// <summary>

    ///     保证Action只被执行一次

    /// </summary>

    public void Do(Action action)

    {

        if (Interlocked.Read(ref _done) == 0)

        {

            DoSlow(action);

        }

    }

    /// <summary>

    ///     保证Action只被执行一次

    /// </summary>

    private void DoSlow(Action action)

    {

        lock (this)

        {

            if (_done != 0) return;

            action();

            Interlocked.Exchange(ref _done, 1);

        }

    }

}

SCISE 是本站注册商标

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注