非忙等待对象初始化

时间:2015-11-03 16:19:39

标签: c# .net-4.0

我想非忙等待变量变为非空:

while (true)
{
    if (myStaticVar != null)
    {
        break;
    }
}

myStaticVar.DoSomething(); 

任何线程都可以随时设置myStaticVar

我坚持.net 4,所以我不能使用async / await。

2 个答案:

答案 0 :(得分:0)

正确的解决方案是让您的线程通过.NET同步原语(如AutoResetEvent)进行通信。可以在SO上找到大量示例,例如here

也就是说,手动线程同步是一个难题,很容易出错。如果您的代码不是时间关键的,并且您更喜欢简单的“忙碌等待”,那么请不要忘记在这样做时节省处理器时间。在循环中添加一些Thread.Sleep或使用SpinWait.SpinUntil

答案 1 :(得分:0)

您可以将变量转换为属性,并使用set访问器调用委托。

void Main()
{
    _someAction = () => Console.WriteLine("Hello world!");

    myStaticVar = 20;
}

private static Int32 _myStaticVar;
private static Action _someAction;

public static Int32 myStaticVar 
{
    get
    {
        return _myStaticVar;
    }
    set
    {
        _myStaticVar = value;

        if (_someAction != null)
            _someAction();
    }
}