下面的代码部分有什么问题?有任何想法吗?我通过串口向我的设备发送命令。在每个命令之后,设备将为此命令工作,然后另一个命令为此启动并继续这样。
Button Click事件中的
{
function1();
Thread.Sleep(5000);
function2();
Thread.Sleep(5000);
function3();
}
我想出如果我从下面的代码中擦除第二次睡眠和功能3,它会同时执行两项功能,但如果我想继续这样做,它就不会执行第三次。
Button Click事件中的
{
function1();
Thread.Sleep(5000);
function2();
}
作品... 谢谢
答案 0 :(得分:5)
您正在阻止UI线程。 不要这样做。这意味着您的UI无法自行更新。相反,设置System.Windows.Forms.Timer
以在5秒内触发,并调用下一个函数。或者,完全在不同的线程中完成所有这些操作(可能使用Sleep
,可能使用另一种计时器来触发线程池线程)并使用Control.Invoke/BeginInvoke
编组回UI线程你需要更新UI本身。
答案 1 :(得分:0)
当代码出现在那里时,它没有任何问题。它会:
但是,由于这是在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毫秒是不够的。