GUI中的C#While循环thread.sleep
在调用的委托方法中有一个while循环。我的问题是,当它在while循环中时,整个GUI被冻结,直到它退出while循环。如何使其不冻结GUI?谢谢GUI中的C#While循环thread.sleep,c#,multithreading,winforms,ui-thread,C#,Multithreading,Winforms,Ui Thread,在调用的委托方法中有一个while循环。我的问题是,当它在while循环中时,整个GUI被冻结,直到它退出while循环。如何使其不冻结GUI?谢谢 if (!IsUploadingAvailable()) { MessageBox.Show("Uploading is not available, please wait until it is ready!", "Upload not available"); myButton.Enabled = false; wh
if (!IsUploadingAvailable())
{
MessageBox.Show("Uploading is not available, please wait until it is ready!", "Upload not available");
myButton.Enabled = false;
while (IsUploadingAvailable())
{
Thread.Sleep(RandomAmountOfTime(10000));
}
MessageBox.Show("Uploading is now available!");
}
您正在阻止GUI线程。您需要在不同的线程上执行工作,例如使用
BackgroundWorker
类。您应该使用计时器
试试这个:
System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
timer1.Interval=10000;//10 seconds
timer1.Tick += new System.EventHandler(timer1_Tick);
if (!IsUploadingAvailable())
{
MessageBox.Show("Uploading is not available, please wait until it is ready!", "Upload not available");
myButton.Enabled = false;
while (IsUploadingAvailable())
{
timer1.Start();
}
MessageBox.Show("Uploading is now available!");
}
private void timer1_Tick(object sender, EventArgs e)
{
//do whatever you want
timer1.Stop();
}
现答覆如下:
您正在阻止UI线程-直到
您离开事件处理程序。一种不成熟的方法是使用
DoEvents(),但这是懒惰的,并且有重新进入的风险
尤其是当你暂停的时候
更好的方法是在后台线程上进行工作,并使用
调用以将数据推送到UI(不要从
工作线程)
区分“快而脏”的应用程序和设计良好的应用程序最重要的一点是,应用程序的用户界面在长时间的操作过程中表现如何。快速而肮脏的方法是只在按钮的单击事件处理程序中完成所有工作,而不必担心用户界面。问题是,当应用程序执行它需要执行的任何工作时,GUI将冻结 另一方面,一个设计良好的应用程序是在后台线程中尽可能多地进行工作的应用程序,保持GUI的响应性,并确保它让用户清楚地知道工作正在后台进行,并调整GUI以禁止在工作完成后才应用的任何用户操作 BackgroundWorker正是为这种场景而设计的 请参阅或使用使用:
将包含代码的方法声明为。如果禁用按钮,为什么要执行Thread.Sleep?这是以前提出的问题。我相信已经有人回答了关于同一主题的问题。查看Winforms中有关“未响应”、“后台工作人员”等的问题。
if (!IsUploadingAvailable())
{
MessageBox.Show("Uploading is not available, please wait until it is ready!", "Upload not available");
myButton.Enabled = false;
await WaitForUploadingAvailable();
MessageBox.Show("Uploading is now available!");
}
async Task WaitForUploadingAvailable()
{
await Task.Run(() =>
{
while (!IsUploadingAvailable())
{
Thread.Sleep(RandomAmountOfTime(10000));
}
});
}