2016-03-08 73 views
2

我正在一個WPF應用程序中,我正在一個線程內進行保存進程。保存過程後,我開始加載過程之間,我需要延遲,所以我用Task.Delay方法。Task.Delay內線程C#

在保存/加載過程中,應用程序中會顯示進度條,直到完成。現在,當我使用Task.Delay方法2秒時,應用程序中沒有顯示進度條。

現在的問題是延遲(2秒)。當有延遲時,用戶開始使用該應用程序,並突然加載過程開始。

所以我需要使Task.Delay方法在Thread之內,這樣我才能顯示延遲的進度條。

我試着下面的代碼,但它引發我一個警告,

//視圖模型代碼:

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

2秒延遲的目的是什麼?恕我直言,如果你有一個問題,你認爲你已經通過相當於'Thread.Sleep'解決了,那麼你可能不明白這個問題。 – moswald

+0

@moswald:我需要線程完成其過程後的延遲。所以我無法使用'Thread.Sleep'。可能是我不知道。你可以請分享我的一些修改後的代碼,以便我可以清楚。 – iamCR

+1

這就是我的意思,爲什麼在線程完成它的過程之後你需要延遲? – moswald

回答

1

BackgroundWorker已過時。改用異步方法並結合Task.Run,問題就會消失。

+0

您可以請發表樣品嗎? – iamCR

+2

(https://www.google.com/webhp?complete=1&hl=zh-CN&gws_rd=ssl#complete=1&hl=zh-CN&q=wpf+task.run+await)有幫助嗎? – usr

0

您的第一個async不是必需的,因爲您不使用await。這就是警告告訴你的。

這相當於您最初發布的內容,所涉及的工作量較少。請注意,現在需要async

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

這不會使進度條來。只有當運行進度條的'BackgroundWorker'到達時。 – iamCR