2017-10-15 86 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); 

行数的,我想去一轮循环的总次数。

希望这有意义吗?

相关问题