不忙于等待对象初始化

本文关键字:对象 初始化 等待 于等待 | 更新日期: 2023-09-27 18:20:20

我想做一个非繁忙的等待变量变为非空:

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

myStaticVar可以由任何线程在任何时间设置。

我被困在.net 4上,所以我不能使用async/await。

不忙于等待对象初始化

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

也就是说,手动线程同步是一个难题,而且很容易出错。如果你的代码不是时间关键型的,并且你喜欢"忙等待"的简单性,那么在这样做的时候不要忘记产生处理器时间。要么在循环中添加一些Thread.Sleep,要么使用SpinWait.PinUntil.

您可以将变量转换为属性,并使用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();
    }
}