0

我有一个运行线程来播放一首或多首歌曲的应用程序。为了创建播放列表,我每隔一个网格更新一次信息。创建播放列表后,如果没有启动线程并且播放列表大于0,我运行一个线程播放歌曲。这是我做的扫描:

if(!thrPlayMusic.IsAlive && existData)
                thrPlayMusic.Start();

但是,在某些情况下,系统正在生成异常 ThreadStateException(),表示线程已经启动。但是他怎么能抛出这个异常,并检查线程是否处于活动状态,然后开始处理呢?有人能帮我吗?谢谢!

4

1 回答 1

0

您需要实现某种lock元素。这将防止多个线程访问一段代码,并防止像您描述的那样的竞争条件。

将您的代码重新编写为类似

private static object lockObject = new lockObject();

有了上面的锁

lock(lockObject)
{
   if(!thrPlayMusic.IsAlive && existData)
       thrPlayMusic.Start();
}

这将确保只有一个线程在锁块中;任何其他进入的线程都将等待锁定语句,直到当前线程完成。

thrPlayMusic.Start();注意:如果方法需要很长时间才能返回,上述方法将无法正常工作。

于 2013-10-02T13:12:04.760 回答