WaitOne()超时参数丢失了吗?

时间:2014-01-27 10:31:13

标签: dot42

为什么System.Threading.WaitHandle.WaitOne()没有为标准.NET实现中提供的超时参数重载:http://msdn.microsoft.com/en-us/library/cc189907(v=vs.110).aspx

在线程休眠期间,请求线程从主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();
}

这是正确的方法吗?

由于

1 个答案:

答案 0 :(得分:0)

这个尚未实施。您可以改用semaphore.tryAcquire

背景:由于其设计,dot42支持整个Android API(C#类是代理并从android.jar生成)。但是仅支持.NET API的一部分,因为.NET类是在Android / Java API之上手工制作的。

相关问题:Java Equivalent of .NET's ManualResetEvent and WaitHandle

更新

我们在Apache License 2.0下released the API,所以任何人都可以立即贡献。我还记录了issue