c#睡眠线程问题

c#睡眠线程问题

问题描述:

下面的代码部分有什么问题?有任何想法吗?我通过串口发送命令到我的设备。在每个命令之后,设备将为这个命令工作,然后另一个命令为它而来,并继续如此。c#睡眠线程问题

在按钮的Click事件

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

我想通了,如果我从代码擦除第二睡眠和功能3像下面

,它都二元函数,但如果我想继续像现在这样,没有做第三个。

在按钮的Click事件

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

作品...... 谢谢

+3

这个问题很难理解,因为在发布的代码中没有严格的问题(尽管通常比`Sleep`更好的机制)。这听起来像是串口设备的问题,但你并没有真正清楚发生什么情况和你期望发生的事情。不确定任何人都可以仅根据当前信息回答这个问题。 – 2011-01-27 07:17:11

+0

`代码中存在什么问题?请提供一个自包含的程序来展示您的问题。 – 2011-01-27 07:17:53

+0

其实我的方案是通过串口配置我的设备。为此我需要发送命令到我的设备。例如,首先我发送第一个命令“fdisk”。我的设备接受此命令并执行。然后我应该发送第二个命令并等待设备执行它然后发送第三个。而我的问题是睡觉线程不适合我。 Thread.Sleep(n); – 2011-01-27 07:23:56

你阻塞UI线程。 不要这样做。这意味着您的用户界面无法自行更新。相反,设置一个System.Windows.Forms.Timer在5秒钟内触发下一个要调用的函数。或者,在完全不同的线程中完成所有这些操作(可能使用Sleep,可能使用另一种定时器在线程池线程上触发),并在需要更新UI本身时使用Control.Invoke/BeginInvoke收回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线程的示例代码,请参阅http://kristofverbiest.blogspot.com/2007/02/simple-pattern-to-invoke-gui-from.html

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

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

谢谢你们。我解决它。问题是我没有让线程睡得足够。 5000毫秒对于第二个命令不够。