c#睡眠线程问题

时间:2011-01-27 07:13:40

标签: c# multithreading sleep

下面的代码部分有什么问题?有任何想法吗?我通过串口向我的设备发送命令。在每个命令之后,设备将为此命令工作,然后另一个命令为此启动并继续这样。

Button Click事件中的

{
  function1();
  Thread.Sleep(5000);
  function2();
  Thread.Sleep(5000);
  function3();
}

我想出如果我从下面的代码中擦除第二次睡眠和功能3,它会同时执行两项功能,但如果我想继续这样做,它就不会执行第三次。

Button Click事件中的

{
  function1();
  Thread.Sleep(5000);
  function2();
}

作品... 谢谢

4 个答案:

答案 0 :(得分:5)

您正在阻止UI线程。 不要这样做。这意味着您的UI无法自行更新。相反,设置System.Windows.Forms.Timer以在5秒内触发,并调用下一个函数。或者,完全在不同的线程中完成所有这些操作(可能使用Sleep,可能使用另一种计时器来触发线程池线程)并使用Control.Invoke/BeginInvoke编组回UI线程你需要更新UI本身。

编辑:鉴于你的“答案”,似乎阻止UI线程只是其中一个问题 - 让设备完全正确响应是一个更大的问题。你不应该只依赖睡眠一段时间。您应该检测设备何时完成上一个命令。 可能它没有给出任何反馈,但那将是可怕的糟糕设计。如果可能的话,研究如何从设备读取关于何时完成的反馈(例如从串口读取!),并且仅在前一个命令完成时启动下一个命令。根据您收到反馈的方式,您可以在非UI线程上使用阻塞调用,或使用异步模型触发事物。

答案 1 :(得分:0)

当代码出现在那里时,它没有任何问题。它会:

  • 执行功能1
  • 睡5秒
  • 执行功能2
  • 睡5秒
  • 执行功能3

但是,由于这是在GUI事件上,它会在执行此操作时冻结应用程序。考虑将执行转移到线程中。

在.Net 4.0中:

Task.Factory.StartNew(() => sendData());

在所有.Net版本中:

System.Threading.Thread myThread = new System.Threading.Thread(sendData);
myThread.IsBackground = true;
myThread.Start();

然后你有了sendData方法:

private void sendData()
{
  function1();
  Thread.Sleep(5000);
  function2();
  Thread.Sleep(5000);
  function3();
}

如果您确实需要在GUI线程中执行操作,可以通过定期调用Application.DoEvents();来提高响应速度,但这不是解决问题的好方法。

另请记住,您无法从其他线程访问GUI。有关如何从其他线程调用GUI线程的示例代码,请参阅http://kristofverbiest.blogspot.com/2007/02/simple-pattern-to-invoke-gui-from.html

答案 2 :(得分:0)

BackgroundWorker可能是解决阻止UI的解决方案。

摆脱睡眠如果函数正在创建自己的线程,请为它们提供在第一个函数完成后触发下一个函数的回调方法。

答案 3 :(得分:-1)

谢谢你们。我解决了问题是我没有使线程足够睡眠。对于第二个命令,5000毫秒是不够的。