2015-11-01 47 views
0
public void OpenUpForm(object sender, EventArgs e) 
    { 
     if (forms.Count == numberoftimes) 
     { 
      forms.ForEach(f => 
      { 
       f.Close(); 
       f.Dispose(); 
      }); 
      forms.Clear(); 
      //Need Delay Here 
      return; 
     } 
     forms.Add(new Form1()); 
     forms.Last().Show(); 
    } 

你好我有這個代碼,我需要在forms.Clear();之後添加延遲但是即時通訊新的編碼我無法弄清楚。 我嘗試過使用Task.DelayThread.Sleep,但它鎖定了我的用戶界面。是否可以添加一個延遲劑量鎖定應用程序?謝謝。在代碼c中插入延遲/等待#

+0

我不明白你需要延遲。這看起來像可怕的代碼。如果你在比你慢的計算機上運行它,它會崩潰嗎?藍屏幕?如果速度更快呢? – Blindy

+0

即時通訊添加數字下降,並希望延遲所選時間的代碼。在較慢的計算機上運行,​​但我很樂意提供建議。 –

回答

3

可以標記方法異步並使用此:

await Task.Delay(2000); 

不會阻塞UI線程

public async void OpenUpForm(object sender, EventArgs e) 
{ 
    if (forms.Count == numberoftimes) 
    { 
     forms.ForEach(f => 
     { 
      f.Close(); 
      f.Dispose(); 
     }); 
     forms.Clear(); 
     await Task.Delay(2000); 
     return; 
    } 
    forms.Add(new Form1()); 
    forms.Last().Show(); 
} 

這會像這樣。

  • 創建該2秒
  • UI線程冒泡回來後運行至完成新的任務了繼續執行/處理其他事件
  • 一旦2秒的UI線程返回並繼續執行異步方法從等待後
+0

當我調試它時,我可以看到延遲計時器已設置,但是當我運行它時,它會像沒有延遲一樣運行(我的延遲是7000)。 –

+0

這是因爲'Task.Delay(7000)'操作永遠不會調用調用線程。它啓動一個新的線程運行,然後返回到您稱之爲的地方。然後它繼續執行。 await關鍵字確保Task.Delay之後的代碼在7秒鐘之前不會執行。 – William