2017-10-15 124 views
1

我正在與c#工作半年前,我正在學習。 我有一個幫助我工作的程序,它在我的工作場所與4種數據庫進行通信。它的工作完美,但現在我想設計使它更酷,但當我想設置一個進度環時,我卡住了,因爲我的方法在與我的數據庫進行通信時凍結UI。 我想建立一個後臺工作人員,我嘗試了所有我發現甚至調用過的東西,但沒有任何工作。如何讓backgroundworker更新UI併爲其設置(城域)進度?

public partial class MainWindow : MetroWindow 
{ 
    BackgroundWorker workerThread = null; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     InstantiateWorkerThread(); 

     progressrinG.IsActive = true; 
    } 
    private void InstantiateWorkerThread() 
    { 
     workerThread = new BackgroundWorker(); 
     workerThread.ProgressChanged += WorkerThread_ProgressChanged; 
     workerThread.DoWork += WorkerThread_DoWork; 
     workerThread.RunWorkerCompleted += WorkerThread_RunWorkerCompleted; 
     workerThread.WorkerReportsProgress = true; 
     //workerThread.WorkerSupportsCancellation = true; 
    } 

    private void WorkerThread_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 

    } 
    private void WorkerThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

    } 
    private void WorkerThread_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //My huge method,asking 4 database that would update UI too 
     //... Textboxes,Grids,Expanders. 
    } 

    private void Button3_Click(object sender, RoutedEventArgs e) 
    { 
     workerThread.RunWorkerAsync(); 

     while (workerThread.IsBusy) 
     { 
      progressrinG.Visibility = Visibility.Visible; 
     } 
    } 
} 

即使調用,當我按下按鈕,5-10秒後結束我的方法,但在做的,我不看我的progressring應用程序被凍結。

有關我該做什麼錯的任何想法?或者我該怎麼辦?提前致謝!

回答

1

不要從WorkerThread_DoWork中的工作線程更新UI,而應通過WorkerThread_ProgressChanged中的UI線程進行更新。

您的工作人員定期致電worker.ReportProgress傳遞任意百分比進度,以便調用WorkerThread_ProgressChanged。僅當百分比差異已更改以防止UI更新耗盡時才更新UI。

+0

我試圖找到一個示例現在如何做到這一點,然後我會嘗試編輯我的方法。謝謝。 Upvoted。 – Tamas555

0

對不起,如果你已經找到了一個例子,但我最近自己做了這個。它稍有不同,但可以根據您的需要進行調整。我有一個微調,我從一個按鈕單擊,也執行我的方法開始,然後我有一個標籤,我使用ReportProgress更新像MickyD建議。

 private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     progress = e.ProgressPercentage; 
     progressLabel.Text = "Creating User " + totalUserCreatedCount + " of " + rowCount; 
    } 

我經過一個循環,我在每次我在循環的頂部重新開始時間報告。我打電話ProgressChanged這樣

backgroundWorker.ReportProgress((100 * i)/rowCount); 

行數的,我想去一輪循環的總次數。

希望這有意義嗎?

相關問題