我正在编写一个运行后台线程的单例类。下面是如何启动和维护这个后台线程的代码:
我在这个类中调用我的方法,像这样从
我查看了错误日志并发现异常:
线程正在运行或已终止,无法重新启动。
在调试中,显示:
----ApplePushNotificatorService.EnsureBackgroundThread ThreadState: Background, WaitSleepJoin
为什么会进入“WaitSleepJoin”状态?是因为我在测试中使用了“Thread.Sleep”吗?
我的保持线程活动的代码是否正确?我该如何解决这个问题?我的想法是当单例上调用“Send”方法时,我们需要确保后台线程正在运行。
编辑:
以下是经过重新设计的代码,现在可以正常工作。
private void EnsureBackgroundThread()
{
try
{
if (this.RunnerThread == null)
this.RunnerThread = new Thread(this.BackgroundRunner) { IsBackground = true };
if (this.RunnerThread.ThreadState != ThreadState.Running)
{
Debug.WriteLine("----ApplePushNotificatorService.EnsureBackgroundThread ThreadState: " + this.RunnerThread.ThreadState);
this.RunnerThread.Start();
}
}
catch (Exception ex)
{
this.LoggerService.Log(null, ex);
}
}
我在这个类中调用我的方法,像这样从
TestClass
中调用:apns.Send("dev", devices, "Testing...", out badIds);
// Wait 5 seconds to let it send stuff through.
Thread.Sleep(5000);
devices.Clear();
devices.Add("some bad id");
// Now let's call this again, but this time we should get back some bad Ids
apns.Send("dev", devices, "Testing...", out badIds);
// Wait 5 seconds to let it send stuff through.
Thread.Sleep(5000);
devices.Clear();
devices.Add("9edc21d0d4e369f50040c5d2c94f2ea29c7d596090e4ddae253712cd406391df");
apns.Send("dev", devices, "Test message for Andrew's phone", out badIds);
// Wait 5 seconds to let it send stuff through.
Thread.Sleep(5000);
我查看了错误日志并发现异常:
线程正在运行或已终止,无法重新启动。
在调试中,显示:
----ApplePushNotificatorService.EnsureBackgroundThread ThreadState: Background, WaitSleepJoin
为什么会进入“WaitSleepJoin”状态?是因为我在测试中使用了“Thread.Sleep”吗?
我的保持线程活动的代码是否正确?我该如何解决这个问题?我的想法是当单例上调用“Send”方法时,我们需要确保后台线程正在运行。
编辑:
以下是经过重新设计的代码,现在可以正常工作。
private void EnsureBackgroundThread()
{
try
{
if (this.RunnerThread != null && this.RunnerThread.IsAlive) return;
this.RunnerThread = new Thread(this.BackgroundRunner) { IsBackground = true };
this.RunnerThread.Start();
}
catch (Exception ex)
{
this.LoggerService.Log(null, ex);
}
}
IsAlive
而不是比较ThreadState
。有很多原因可能导致线程尚未完成工作时就不再运行(包括您的Thread.Sleep
调用,但也包括执行lock
或调用同步I/O时)。此外,多线程不应该基于试错的基础上进行。您应该了解发生了什么,否则您几乎肯定会得到意外的行为。 - Luaanawait
/async
吗?这样做有什么原因吗? - Luaan