2016-07-05 4 views
3

Я ищу, чтобы заменить метод SpinWait в PCL, нацеленном на ASPNET Core, .NET 4.5.2 и Android + iOS через Xamarin, но не может найти прямой эквивалент. На данный момент я смотрю на заменуSpinwait для ряда спинов в библиотеке портативных классов

System.Threading.Thread.SpinWait(10); 

с

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

, но я понятия не имею, если я открываю банку с червями, делая. или, если возможно,

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

лучше. Я избегал этого, потому что SpinOnce() дает после каждого вращения, поэтому кажется, что он менее эффективен.

Контекст:

Я в настоящее время портирования этот высокоточный таймер для PCL (САШ Core, .NET 4.5.2 и Android + прошивкой через Xamarin) и наталкивается вопрос с Удаление метода SpinWait. http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer

В .NET Framework правильного существует метод SpinWait(), который принимает Int, которая диктует, сколько спины ждать (https://msdn.microsoft.com/en-us/library/system.threading.thread.spinwait(v=vs.110).aspx), но пространство имен 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 
     } 
    } 
Смежные вопросы