#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 是本站注册商标
发表回复