我有一个应用程序运行一个线程来播放一首或多首歌曲。要创建播放列表,我每隔一个网格更新一次信息。创建播放列表后,如果线程未启动且播放列表大于0,则运行一个线程播放歌曲。 这是我的扫描:
if(!thrPlayMusic.IsAlive && existData)
thrPlayMusic.Start();
但是,在某些情况下,系统正在生成异常ThreadStateException(),表示该线程已经启动。但他如何抛出此异常,并检查线程是否处于活动状态然后开始处理?有人能帮我吗?谢谢!
答案 0 :(得分:0)
您需要实现某种lock
元素。这将阻止多个线程访问一段代码,并防止像您描述的那样的竞争条件。
将代码重写为
private static object lockObject = new lockObject();
使用上述锁定
lock(lockObject)
{
if(!thrPlayMusic.IsAlive && existData)
thrPlayMusic.Start();
}
这将确保锁定块中只有一个线程;任何其他线程进入将等待锁定语句,直到当前线程完成。
注意:如果thrPlayMusic.Start();
方法需要很长时间才能返回,则上述方法无效。