2017-02-04 67 views
1

我有一個包含項目的列表框,用戶可以對項目執行某些操作,例如新建/編輯/刪除。但是,這可能需要一些時間,並且我希望在執行基礎操作時顯示不確定的進度條。耗時的工作和進度條

我應該如何處理.NET 4.6 & C#6.0? 根據this post我應該使用基於任務的異步模式(TAP)。在線程中有許多可能的解決方案。

這仍然是首選方法嗎?

回答

1

這裏首先要了解的是,你應該執行新/編輯/刪除操作一個後臺線程,以保持您的UI響應,並使ProgressBar能夠在這些操作完成所需的時間內進行更新。

將某些工作轉移到後臺線程的首選和最簡單的方法是使用任務並行庫(TPL)並開始一個新任務。請記住,WPF控件具有線程關聯性,因此只能在它們最初創建的線程上訪問它們,並且它是調度程序線程。

所以,你可以通過設置ProgressBarVisibleVisibility屬性實現這一點,開始執行實際新建/編輯/刪除操作的任務,然後設置Visibility屬性回Collapsed再次,一旦任務完成:

C#:

pb.Visibility = Visibility.Visible; 
Task.Run(()=> 
{ 
    //perform your long-running operation here...make sure that you don't access any UI elements 
    Save(); 
}) 
.ContinueWith(task => 
{ 
    //this delegate will be executed back on the UI thread once the task has finished because of the scheduler returned from the TaskScheduler.FromCurrentSynchronizationContext() method... 
    pb.Visibility = Visibility.Collapsed; 
}, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); 

XAML:

<ProgressBar x:Name="pb" IsIndeterminate="True" Visibility="Collapsed" /> 
+0

上面給出的C#通常位於xaml.cs文件中嗎?我在ViewModel中具有新建/編輯/刪除功能,並通過命令「訪問」。我對WPF和MVVM非常陌生,我只是試圖找到最好的做法,但我並不是很擅長。此外,例如刪除,我從列表框(顯然是一個UI元素),也從解決方案資源管理器(我忙於一個VS包擴展)刪除項目,這最後一個需要幾秒鐘。所以我不確定我不應該像你說的那樣訪問一個UI元素? – Igavshne

+0

應該在視圖模型中實現新建/編輯/刪除功能。不是直接設置ProgressBar的Visibility屬性,而是設置綁定到ProgressBar的源屬性的值。我猜你的操作實際上執行了一些可能需要一些時間的工作,例如與數據庫或服務層進行通信。如果你只是想從列表框中刪除一個項目,或者更確切地說是綁定到列表框的ObservableCollection,你根本不需要ProgressBar。 – mm8

+0

啊,是的,當然,我可以設置綁定到ProgressBar的源屬性的值。是的,我確實與一個數據庫進行了溝通。謝謝,我會嘗試你的答案,然後回來。 – Igavshne

0

在C#中,您可以使用工具箱中的progressBar工具顯示不確定的時間。

爲了使用progressBar只需將它拖放到窗體上。

現在要解決主要問題,您需要顯示一個不確定的時間。 要顯示在進度條的進度,則使用定時器和以下代碼:

int value = 0; 
private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (value < 100)//value at 100 can be any large integer since indeterminant time 
     { 
      value++; 
      progressBar1.Value = value; 
     } 

    } 

組timer1.Interval = 100;

變量值是您爲progressBar設置的最大值。

由於您不知道時間,因此將progressBar的最大值設置爲10000或其他任何大值。 現在啓用計時器,當你輸入你的功能(說新/編輯/刪除),並禁用計時器,當你退出你的功能

+0

我不立這個解決方案。你只是「欺騙」進度欄的值。相反,可以使用@ mm8答案中指出的進度條的Indeterminate屬性。 –

+0

它可能是作弊,但會起作用。現在最主要的是,你沒有告訴用戶應用程序完成這些任務需要多少時間,因此不確定的時間。所以根據我的說法,當任務由應用程序完成時,您不需要顯示100%的進度條。 –

+0

我不認爲這是很好的編程習慣。無論誰要在我之後維護代碼,肯定都會浪費時間來弄清楚發生了什麼。 – Igavshne