【问题标题】:How to fix ThreadStateException() in C#?如何在 C# 中修复 ThreadStateException()?
【发布时间】:2013-10-02 23:11:04
【问题描述】:

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

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

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

【问题讨论】:

  • 你应该锁定 if
  • 我不明白你在说什么......
  • c# lock reference -> msdn.microsoft.com/it-it/library/c5kehkcz.aspx 很可能线程在您检查之后但在您发出 start 语句之前启动
  • 您在哪个线程上创建播放列表?哪个线程正在运行您发布的代码?

标签: c# .net multithreading


【解决方案1】:

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

将您的代码修改为类似

private static object lockObject = new lockObject();

用上面的锁

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

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

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

【讨论】:

  • 请不要推荐他在线程上使用lock。他应该创建一个对象。
  • @SAM 我不太明白。有多个线程启动播放器。你能解释一下创建一个对象是如何解决这个问题的吗?
  • 我的意思是创建一个对象并锁定该对象而不是锁定线程本身。这可能会导致死锁。
  • @SAM 你是对的,我没有对我锁定的对象给予应有的注意。已更正。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多