2016-07-05 90 views
3

我正在寻找取代通过Xamarin的ASPL核心,.NET 4.5.2和Android + iOS的PCL中的SpinWait方法,但找不到直接的等效。目前我正在寻找与Spinwait在便携式类库中的一些自旋

SpinWait spinWait = new SpinWait(); 
SpinWait.SpinUntil(() => spinWait.Count >= 10); 

更换

System.Threading.Thread.SpinWait(10); 

,但我不知道如果我这样做打开一罐蠕虫。或者如果可能的话

for(int i=0; i<10; i++) SpinOnce(); 

更好。我避免了这种情况,因为SpinOnce()在每次旋转后都会产生效果,因此看起来可能效率较低。

语境:

我目前移植这种高精度计时器到PCL(ASPNET核心,.NET 4.5.2和Android + iOS的通过Xamarin)和来面对的问题与SpinWait方法去除。 http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer

在适当的.NET Framework中有一个方法SpinWait(),它接受该决定多少旋转等待 (https://msdn.microsoft.com/en-us/library/system.threading.thread.spinwait(v=vs.110).aspx)一个int,但针对这个当System.Threading.Thread命名空间不可用框架的组合,但包括一个SpinWait结构(https://msdn.microsoft.com/en-us/library/system.threading.spinwait(v=vs.110).aspx),它允许我访问SpinOnce()和一个接受布尔返回函数的SpinUntil()方法。

回答

2

原来,我关于避免屈服的直觉并不完全正确,并且发现在SpinUntil的来源(http://referencesource.microsoft.com/#mscorlib/system/threading/SpinWait.cs)中实际上存在对SpinOnce()的重复调用。

没有错误检查逻辑它看起来像这样:

//Error Checking Logic 
SpinWait spinner = new SpinWait(); 
     while (!condition()) 
     { 
      //Timeout checks 
      spinner.SpinOnce(); 
      //Timeout and Yielding checks 
      } 
     } 
//Return Logic 

因此,我以此为实现可接受的例子,将使用(除非有更好的解决方案提出了自己)类似下面的东西重新创建所需的行为。

SpinWait spinner = new SpinWait(); 
    while (spinner.Count<10) 
    { 
     spinner.SpinOnce(); 
     //Timeout and Yielding checks 
     } 
    }