全部,我想更新ToolStripMenu
以显示SqlConnection
失败。我希望错误消息显示一段时间timeToWaitMs
(以毫秒为单位),然后在一段时间和一些操作后刷新UI回到正常状态。目前我正在做(删除了一些不必要的细节)
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
- 我不希望这样。如何强制显示错误消息一段时间,之后我将返回非错误状态?
感谢您的时间。
答案 0 :(得分:5)
我根本不会在这里使用任务 - 至少没有C#5中的异步功能。在C#5中你可以写:
await Task.Delay(millisToWait);
但是直到你有了这个,我才会使用适合你用户界面的计时器,例如: System.Windows.Forms.Timer
或System.Windows.Threading.DispatcherTimer
。只需使用您目前获得的作为计时器的“tick”处理程序的延续,并适当地安排它。
答案 1 :(得分: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);
}