2015-05-18 128 views
0

我在我的項目中提供了一個可以提供忙碌指示符(旋轉圓圈)的控件。我希望它在用戶選擇一個文件來將數據加載到數據網格中時運行。直到我的數據網格被填充爲止,忙指標纔會顯示出來。如何在檢索數據時顯示忙碌指示符?我相信我應該使用一個線程,但我不太瞭解他們,並且正在努力學習。我已經嘗試了很多不同的方式,下面是我最近的嘗試,我不知道我是否接近。忙碌指示燈直到數據顯示才顯示

public void DoWork() 
{ 
this.StartProgressBar(); 

Task.Factory.StartNew(() => 
    { 
     UIDispatcher.Current.BeginInvoke(() => 
      { 
       if (fileCompleted != null && !string.IsNullOrEmpty(fileCompleted.SelectedFile)) 
       { 
        this.TestResults.Clear(); 

        LoadedFileInfo info = this.Model.OpenTestCompleted(fileCompleted.SelectedFile); 

        foreach (var model in info.Sequence.Models) 
        { 
         foreach (var details in model.Tests) 
         { 
          this.TestResults.Add(new TestResultsModel(details, model.Name.Substring(0, model.Name.IndexOf('.')))); 
         } 
        } 
       } 
      }); 
    }); 
} 

private void StartProgressBar() 
{ 
    TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext(); 

    CancellationToken cancelationToken = new CancellationToken(); 
    Task.Factory.StartNew(() => this.StopProgressBar()).ContinueWith(
     m => 
     { 
      this.ToggleProgressBar = true; 
     }, 
     cancelationToken, 
     TaskContinuationOptions.None, 
     scheduler); 
} 

private void StopProgressBar() 
{ 
    this.ToggleProgressBar = false; 
} 
+1

你可能想看看的BackgroundWorker:https://msdn.microsoft.com/de-de/library/system.componentmodel.backgroundworker%28v=vs。 110%29.aspx – Ben

+0

感謝您的答覆,我看了一下,但我不明白這足以知道我是否正確使用了我的情況中的示例。我不知道如何將我的代碼放在上面,並將其分解爲後臺任務。你能在這裏提供任何幫助嗎? – Wannabe

回答

2

我真的同意@Ben,你應該研究如何使用任務。你正在創建後臺線程,並且在UI線程上工作,無論如何,這都不可避免地佔用了UI線程。嘗試簡單一些,看看它是否有效。至於你的取消令牌,我不知道你是怎樣並且能夠重置它的,因爲它不是你班上的一個屬性,所以這裏是一個沒有它的樣本..

怎麼樣東西像這樣:

​​

}

+1

我猜TestResults是一個ObservableCollection(基於問題的標籤),這意味着它需要在UI線程上修改。 OP可以使用BeginInvoke爲每個項目執行此操作,但如果涉及大量項目,則實際上可能會出現問題。 WPF綁定方案(假設OP不想顯示部分結果)的最佳性能是用一個新集合替換整個TestResults屬性,然後爲TestResults屬性引發相應的PropertyChanged通知。 –

+0

謝謝你的建議。我將更多地考慮任務,並嘗試BeginInvoke並將結果回饋給我們。 – Wannabe

+0

我會同意@Dan Bryant。快速測試是將ObservableCollection更改爲List,仍然將其填充到後臺線程中,並在完成後,在ToggleProgressBar = false,RaisePropertyChanged(「TestResults」)行下面進行測試。它應該更新綁定,而不需要由可觀察集合創建的聊天。 –