为什么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();
}
这是正确的方法吗?
由于
答案 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。