在线程C#中的Task.Delay

时间:2016-03-08 12:14:53

标签: c# wpf multithreading task

我正在WPF应用程序中工作,我在一个线程中进行了一个保存过程。在保存过程之后我启动了加载过程,我需要延迟,所以我使用Task.Delay方法。

在保存/加载过程中,应用程序中会显示一个进度条,直到它完成。现在,当我使用Task.Delay方法2秒时,应用程序中没有显示进度条。

现在问题是延迟(2秒)。当出现延迟时,用户开始使用该应用程序,然后突然启动加载过程。

所以我需要让Task.Delay方法在Thread内,这样我才能显示延迟的进度条。

我尝试了以下代码,但它向我发出警告,

// ViewModel代码:

 BackgroundWorker bw;
 async System.Threading.Tasks.Task PutTaskDelay()  //warning here
        {
            bw = new BackgroundWorker();
            IsBusy = true;        // to show the progress bar
            bw.RunWorkerAsync();

            bw.DoWork += async (s, e) =>
            {
                await System.Threading.Tasks.Task.Delay(2000);
            };

            bw.RunWorkerCompleted += (s, e) =>
            {
                IsBusy = false;   // Hide the progress bar
            };
        }

警告:

The async method lacks await operators and will run synchronously. Consider using the async operator to await non-blocking API calls, or await Task.Run(...) to do CPU-bound work on a backgrond thread.

如果有替代方法,请告诉我。

2 个答案:

答案 0 :(得分:1)

BackgroundWorker已过时。将异步方法与Task.Run结合使用,问题就会消失。

答案 1 :(得分:0)

您的第一个async不是必需的,因为您没有使用await。那是警告告诉你的。

这相当于您最初发布的内容,涉及的工作量少得多。请注意,现在需要async

async Task PutTaskDelayAsync()   // convention is to name async methods with Async suffix
{
    IsBusy = true;
    await Task.Delay(2000);
    IsBusy = false;
}