c#休眠线程问题

c#休眠线程问题,c#,multithreading,sleep,C#,Multithreading,Sleep,下面代码部分的问题是什么?有什么想法吗?我通过串口向我的设备发送命令。在每个命令之后,设备将为这个命令工作,然后另一个命令将为它工作,并继续这样 在按钮点击事件中 { function1(); Thread.Sleep(5000); function2(); Thread.Sleep(5000); function3(); } { function1(); Thread.Sleep(5000); function2(); } 我发现如果我从下面的代码中删除第二

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

在按钮点击事件中

{
  function1();
  Thread.Sleep(5000);
  function2();
  Thread.Sleep(5000);
  function3();
}
{
  function1();
  Thread.Sleep(5000);
  function2();
}
我发现如果我从下面的代码中删除第二个sleep和function3,它会同时执行两个功能,但如果我想继续这样做,它不会执行第三个功能

在按钮点击事件中

{
  function1();
  Thread.Sleep(5000);
  function2();
  Thread.Sleep(5000);
  function3();
}
{
  function1();
  Thread.Sleep(5000);
  function2();
}
工作。。。
谢谢

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


编辑:考虑到你的“答案”,阻塞UI线程似乎只是问题之一,而让设备正确响应是一个更大的问题。你不应该只依赖睡眠一段时间。您应该检测设备何时完成上一个命令。它可能不提供任何反馈,但这将是非常糟糕的设计。如果可能的话,研究如何从设备读取关于何时完成的反馈(例如,从串行端口读取!),并且仅在前一个命令完成时启动下一个命令。根据您接收反馈的方式,您可以对非UI线程使用阻塞调用,或者使用异步模型触发事件。

您正在阻塞UI线程。不要那样做。这意味着您的UI无法自我更新。相反,将
System.Windows.Forms.Timer
设置为在5秒内启动,然后调用下一个函数。或者,在完全不同的线程中执行所有这些操作(可能使用
Sleep
,可能使用另一种计时器在线程池线程上启动),并使用
Control.Invoke/BeginInvoke
在需要更新UI本身时返回UI线程


编辑:考虑到你的“答案”,阻塞UI线程似乎只是问题之一,而让设备正确响应是一个更大的问题。你不应该只依赖睡眠一段时间。您应该检测设备何时完成上一个命令。它可能不提供任何反馈,但这将是非常糟糕的设计。如果可能的话,研究如何从设备读取关于何时完成的反馈(例如,从串行端口读取!),并且仅在前一个命令完成时启动下一个命令。根据您接收反馈的方式,您可以在非UI线程上使用阻塞调用,或者使用异步模型来触发事件。

正如代码所示,它没有任何问题。它将:

  • 执行功能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线程的示例代码,请参阅。

当代码显示在那里时,它没有任何问题。它将:

  • 执行功能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线程的示例代码,请参阅。

BackgroundWorker可能是解决UI阻塞的解决方案


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

BackgroundWorker可能是解决UI阻塞的解决方案


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

谢谢大家。我解决它。问题是我没有让线程睡眠充足。5000毫秒不足以执行第二个命令。

谢谢大家。我解决它。问题是我没有让线程睡眠充足。5000毫秒不足以执行第二个命令。

这个问题很难理解,因为发布的代码中没有严格的问题(尽管通常有比
睡眠
更好的机制)。这听起来像是串行设备的问题,但是你没有真正弄清楚发生了什么和你期望发生什么。不确定是否有人可以仅根据当前信息回答此问题。
代码中的问题是什么
请提供一个独立的程序来演示您的问题。实际上,我的方案是通过串行端口配置我的设备。为此,我需要向我的设备发送命令。例如,首先我发送第一个命令“fdisk”