2014-11-22 49 views
0

我正在使用Winforms C#.net應用程序。C#Winforms卡住並轉到「無響應」狀態

public partial class FormMain : Form 
{ 
private bool cancelQueryWaitRequested = false; 

public FormMain() 
{ 
     InitializeComponent(); 
} 

private async void btnQueueStart_Click(object sender, EventArgs e) 
{ 
    QueryFinishedWait(); 
} 

private int QueryFinishedWait() 
{ 
     int i = 1; 
     reQueueUIStart(); 
     groupWaitQueue.Visible = true; 
     for (i = 0; i < 20; i++) 
     { 
      lblQueueWaitSeconds.Text = (20 - i).ToString(); 
      Thread.Sleep(1000); 

      if (cancelQueryWaitRequested) 
       break; 
     } 
     groupWaitQueue.Visible = false; 
     reQueueUIStop(); 
     return i; 
    } 
} 

當我執行此操作時,應用程序出現「未響應」,我可以看到處理器使用率變得非常高。

但是當我在btnQueueStart_Click內運行相同的循環時,它工作正常。

我知道我做錯了什麼,還是不知道是什麼。

在此先感謝。

+2

你不應該在循環中進行倒計時,並在每次迭代中睡一秒鐘。看看Timer類。 http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=vs.110%29.aspx – 2014-11-22 13:00:06

+0

我正在使用Thread.Sleep進行演示,但我正在使用await Task.Delay( 1000);實際功能。你是對的! – Kush 2014-11-22 13:22:41

回答

1

但是,當我在btnQueueStart_Click中運行相同的循環它正常工作。

這是因爲事件處理程序是異步的,但是當你調用你的方法時會破壞它。

private async void btnQueueStart_Click(object sender, EventArgs e) 
{ 
    //QueryFinishedWait(); 
    await QueryFinishedWait(); 
} 

async private Task<int> QueryFinishedWait() 
{ 
    ... // await something 
} 

但似乎你錯了另一塊異步謎題。請注意,不建議等待Sleep()