2012-11-14 57 views
1

全部我想更新ToolStripMenu以顯示SqlConnection失敗。我想要顯示一段時間的錯誤消息timeToWaitMs(以毫秒爲單位),然後在一段時間和某些操作之後將界面刷新回正常狀態。目前,我做(有一些非必要的細節,去掉)在更新用戶界面前強制任務等待

public void ShowErrorWithReturnTimer(string errorMessage, int timeToWaitMs = 5000) 
{ 
    // Update the UI (and images/colors etc.). 
    this.toolStripLabelState.Text = errorMessage; 

    // Wait for timeToWait and return to the default UI. 
    Task task = null; 
    task = Task.Factory.StartNew(() => 
     { 
      task.Wait(timeToWaitMs); 
     }); 

    // Update the UI returning to the valid connection. 
    task.ContinueWith(ant => 
     { 
      try 
      { 
       // Connection good to go (retore valid connection update UI etc.)! 
       this.toolStripLabelState.Text = "Connected"; 
      } 
      finally 
      { 
       RefreshDatabaseStructure(); 
       task.Dispose(); 
      } 
     }, CancellationToken.None, 
      TaskContinuationOptions.None, 
      mainUiScheduler); 
} 

我的問題是,task.Wait(timeToWaitMs);導致要顯示的Cursors.WaitCursor - 我不想這樣。如何強制顯示錯誤消息一段時間,之後我又回到非錯誤狀態?

謝謝你的時間。

+1

只要刪除'task.Wait(timeToWaitMs);'?開始一項任務只是讓它等待是毫無意義的。 –

回答

5

我不會用一個任務都在這裏 - 至少在沒有在C#5異步功能在C#5你可以只寫:

await Task.Delay(millisToWait); 

但是除非你已經得到了,我只需使用適合您的用戶界面的定時器,例如System.Windows.Forms.TimerSystem.Windows.Threading.DispatcherTimer。只需使用您當前獲得的作爲計時器的「滴答」處理程序的延續,並適當安排。

+0

好的,但它似乎比我目前做的整齊。爲什麼'async' /'awate'特性意味着它沒問題 - 因爲編譯器正在爲我在這裏的'Task'/Continuation'結構構造一些simalar的場景。一如既往,感謝你的時間Jon。 – MoonKnight

+0

@Killercam:它不那麼整潔?你想在一定的時間內發生一些事 - 這正是計時器的目的。 async/await允許異步等待完成任何可等待的事情,包括'Task.Delay'。基本上它正在做類似於你現在正在做的事情,但更簡單。 –

1

您可以使用Timer而不是task.Wait()。您可以讓它等待一段時間。一旦計時器滴答,回調就可以開始更新。

var timer = new Timer(timeToWaitMs); 
timer.Elapsed += (s, e) => 
           { 
            timer.Stop(); 
            UpdateValidConnection(); 
           }; 



private void UpdateValidConnection() 
{ 
    Task.Factory.StartNew(() => 
    { 
     try    
     { 
      this.toolStripLabelState.Text = "Connected"; 
     } 
     finally 
     { 
      RefreshDatabaseStructure(); 
     } 
    }, CancellationToken.None, TaskCreationOptions.None, mainUiScheduler); 
} 
+0

我意識到這一點,但我不能這樣做,因爲我不想更新每個'timeToWaitMs' - 就在我調用方法時。謝謝你的時間。 – MoonKnight

+0

這就是爲什麼我寫了「timer.Stop();」在Elapsed回調 – margabit

+0

+1,錯過了... – MoonKnight