0

为什么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;
    }
}

感谢弗兰克的(第 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();
}

这是做____的正确的方式吗?

谢谢

4

1 回答 1

0

这个还没有实施。你可以semaphore.tryAcquire改用。

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

相关问题:.NET 的 ManualResetEvent 和 WaitHandle 的 Java 等效项

更新

我们在 Apache License 2.0 下发布了 API ,因此现在任何人都可以做出贡献。我还记录了一个问题

于 2014-01-27T11:06:01.630 回答