1

全部,我想更新 aToolStripMenu以显示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显示 - 我不想要这个。如何强制显示错误消息一段时间,然后返回非错误状态?

谢谢你的时间。

4

2 回答 2

5

我根本不会在这里使用任务 - 至少在没有 C# 5 中的异步功能的情况下不会。在 C# 5 中你可以写:

await Task.Delay(millisToWait);

但在你明白之前,我只会使用适合你的 UI 的计时器,例如System.Windows.Forms.TimerSystem.Windows.Threading.DispatcherTimer. 只需使用您当前获得的作为计时器的“tick”处理程序的延续,并适当地安排它。

于 2012-11-14T12:46:03.183 回答
1

您可以使用计时器,而不是 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);
}
于 2012-11-14T13:28:50.453 回答