2014-01-27 2 views
0

почему System.Threading.WaitHandle.WaitOne() не перегружать для параметров тайма-аута, имеющихся в наличии в стандартной реализации .NET: http://msdn.microsoft.com/en-us/library/cc189907(v=vs.110).aspxWaitOne() параметр таймаута потерян?

Это очень полезно в рабочих потоках, когда во время сна нити, нить предлагается остановить от Main UI нити .. Другие способы его реализовать?

Пример:

public void StartBatteryAnimation() 
{ 
    whStopThread = new ManualResetEvent(false); 

    batteryAnimationThread = new Thread(new ThreadStart(BatteryAnimation_Callback)); 
    batteryAnimationThread.Start(); 
} 

public void StopBatteryAnimation() 
{ 
    whStopThread.Set();  

    batteryAnimationThread.Join(); 

    batteryAnimationThread = null; 
    whStopThread.Dispose(); 
    whStopThread = null; 
} 

public void BatteryAnimation_Callback() 
{ 
    bool exitResult = false; 

    while (true) 
    { 
     // Do some stuff 
     exitResult = whStopThread.WaitOne(WAIT_INTERVALL); 
     if (exitResult) break; 
    } 
} 

Спасибо Frank за (1000 !!) ответ.

Так что мой обычай реализации для WaitHandle.WaitOne(int Timeout) было:

private Thread batteryAnimationThread  = null; 
private Semaphore batteryAnimationSemaphore = null; 

public void StartBatteryAnimation() 
{ 
    batteryAnimationSemaphore = new Semaphore(1); 
    batteryAnimationSemaphore.Acquire(); 

    batteryAnimationThread = new Thread(new ThreadStart(BatteryAnimation_Callback)); 
    batteryAnimationThread.Start(); 
} 

public void StopBatteryAnimation() 
{ 
    batteryAnimationSemaphore.Release(); 

    batteryAnimationThread.Join(); 

    batteryAnimationThread = null; 
    batteryAnimationSemaphore = null; 
} 

public void BatteryAnimation_Callback() 
{ 
    bool stopThread = false; 

    try 
    { 
    while (true) 
    { 
     // Do some stuff.. 

     stopThread = batteryAnimationSemaphore.TryAcquire(1, BATTERY_ANIMATION_INTERVALL, Java.Util.Concurrent.TimeUnit.MILLISECONDS); 

     if (stopThread) break; 
    } 
    catch (Exception ex) 
    { 
    } 

    batteryAnimationSemaphore.Release(); 
} 

Является ли это правильный путь для?

Thanks

ответ

0

Этот еще не был реализован. Вместо этого вы можете использовать semaphore.tryAcquire.

Фон: Благодаря своей конструкции dot42 поддерживает весь Android API (классы C# являются прокси и генерируются из android.jar). Но поддерживает только часть .NET API, потому что классы .NET обрабатываются поверх Android/Java API.

Связанные вопрос: Java Equivalent of .NET's ManualResetEvent and WaitHandle

UPDATE

Мы released the API под Apache License 2.0, так что каждый может внести свой вклад в настоящее время. Я также зарегистрировал issue.

+0

Обновлено мой вопрос – minimega

Смежные вопросы