让BackgroundWorker等待UI线程显示图像

时间:2014-01-20 15:52:43

标签: c# wpf multithreading backgroundworker

好的,所以我有一个WPF应用程序,按下按钮会运行这样的测试列表:

  1. 在GUI中按下RunTest按钮
  2. 创建BackgroundWorker并开始运行DoWork(见下文):
  3. 当t.Name ==“TestSpecial”时,我想在继续之前在UI中显示图像。在我继续之前,图像显示至关重要。

    DoWork(...)
    {
        List<Test> tests = ....
    
        for (Test t in tests)
        {
            switch(t.Name)
            {
                case "Test1":
                    //Do something
                    break;
                case "Test2":
                    //Do something else 
                    break;
                ...
                case "TestSpecial":
                    // Here I want to:
                    // 1. Tell UI to show an image on the screen
                    // 2. Wait for the image to show up
                    // 3. Continue with my test
                    break;
                case "TestN+1":
                    //Do something completly different
                    break;
            }
        }
    }
    
  4. 我可能会使用Dispatcher.InvokeAsync或类似内容来显示图片,但是有没有办法等待它完成或以某种其他方式保证图像在继续之前显示?

3 个答案:

答案 0 :(得分:0)

我认为,如果您使用BackgroundCernged事件使用BackgroundWorker http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx,那么它就可以实现。

编辑:以下是您案例中适用的msdn文章的代码

//create worker
BackgroundWorker bw = new BackgroundWorker();

//set progress to true
bw.WorkerReportsProgress = true; 

// handle events
bw.DoWork += new DoWorkEventHandler(DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);

//method for work
private DoWork(object sender, DoWorkEventArgs e)
{

BackgroundWorker worker = sender as BackgroundWorker;
List<Test> tests = ....

for (Test t in tests)
{
    switch(t.Name)
    {
        case "Test1":
            //Do something
            break;
        case "Test2":
            //Do something else 
            break;
        ...
        case "TestSpecial":
            // Here I want to:
            // 1. Tell UI to show an image on the screen
            // 2. Wait for the image to show up
            // 3. Continue with my test
            worker.ReportProgress(1);
            break;
        case "TestN+1":
            //Do something completly different
            break;
    }
}
} 

//method for progress
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //set your image here
}

答案 1 :(得分:0)

我认为那个可怜的老@TomKos正在回答......如果只是他已经解释得更好了。

首先,请在StackOverflow上的Progress Bar update from Background worker stalling帖子中查看我的BackgroundWorker类的示例实现。

现在,在DoWork方法中,请注意对backgroundWorker.ReportProgress(i);的通话。这会将一个数字传递回UI线程,该线程表示已完成工作的百分比。

您可以实现类似的功能,并在想要显示图像时将特定值传递回UI。在DoWork方法的某个阶段,您可以像这样传递值:

private void DoWork(object sender, DoWorkEventArgs e)
{
    // Do some long running process here
    backgroundWorker.ReportProgress(1); // Send signal to show the image
    // Maybe do some more long running process here
}

你可以在UI中处理它:

private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    if (e.ProgressPercentage == 1)
    {
        // Show your image
    }
}

答案 2 :(得分:0)

100%的时间会告诉用户界面显示图像以及图像在屏幕上时会有延迟。由于某种原因,游戏玩家在显卡上花了很多钱。

加载是最后一次活动 Loaded事件在最终渲染之前引发,但在布局系统计算出所有必要的渲染值之后。

没有渲染事件(我知道)。

我会在Loaded事件中尝试延迟 100,000不是那么多 即使是1/10秒的延迟也只有几个小时。