不忙于等待对象初始化
本文关键字:对象 初始化 等待 于等待 | 更新日期: 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();
}
}