C#while在GUI中循环thread.sleep

时间:2014-06-25 09:23:52

标签: 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;

    while (IsUploadingAvailable())
    {
        Thread.Sleep(RandomAmountOfTime(10000)); 
    }
    MessageBox.Show("Uploading is now available!");
}

5 个答案:

答案 0 :(得分:0)

您正在阻止GUI线程。您需要在不同的线程上完成工作,例如使用BackgroundWorker类。

答案 1 :(得分:0)

您应该使用Timer

试试这个:

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();
}

答案 2 :(得分:0)

在这里回答: - Thread sleep in a for loop

  

您正在阻止UI线程 - 直到没有更新通常会显示   你离开了事件处理程序。一个hacky方法是使用   Application.DoEvents(),但这很懒惰并且冒着重新入侵的风险   特别是如果你正在暂停。

     

更好的方法是在后台线程上进行工作,然后使用   调用将数据推送到UI(不要与UI通信)   工人线程)。

答案 3 :(得分:0)

将“快速和脏”应用程序与设计良好的应用程序区分开来的最重要的事情之一是应用程序的用户界面在冗长的操作过程中的行为方式。快速而肮脏的方法是在按钮的Click事件处理程序中完成所有工作,而不用担心用户界面。这样做的问题是,当应用程序完成它需要做的任何工作时,GUI将会冻结。

另一方面,设计良好的应用程序是在后台线程中尽可能多地完成工作,保持GUI响应并确保它使用户明白正在进行的工作的应用程序。后台并调整GUI以禁止在工作完成之前不适用的任何用户操作。

BackgroundWorker就是为这种情况而设计的。

请参阅MSDN或使用Task Parallel Library

答案 4 :(得分:0)

使用Task

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));
        }
    });
}

将包含代码的方法声明为async