2016-07-05 5 views
3

Xamarin을 통해 ASPNET Core, .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, 안드로이드 + 아이폰 OS)이 고정밀 타이머를 이식하여 발생하는 문제에 대해 최대 간다 SpinWait 메소드 제거. 적절한 .NET Framework의 http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer

는 방법 (https://msdn.microsoft.com/en-us/library/system.threading.thread.spinwait(v=vs.110).aspx)을 기다리는 회전 얼마나 많은 지시 int를 받아 SpinWait()하지만,이를 대상으로 할 때 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 
     } 
    }