如何从BackgroundWorker返回列表以在UI线程的下一行代码中使用? - c#

我正在尝试对运行BackgroundWorker进程的应用程序进行编码,该进程执行耗时的操作。在主线程中,计时器更新进度条(这是this question的延续)。但是,此代码不显示MessageBoxes。在foreach (String word in this.words)事件处理程序中的SearchButton_Click行上设置断点将显示this.words没有值,即this.words.Count() == 0

public partial class Form1 : Form
{
    System.Windows.Forms.Timer searchProgressTimer;
    List<String> words;

    public Form1()
    {
        InitializeComponent();

        words = new List<String>(3);
    }

    private void SearchDatabase_Click(object sender, EventArgs e)
    {
        this.searchProgressTimer.Start();
        SearchBackgroundWorker.RunWorkerAsync();

        foreach (String word in this.words) // BREAKPOINT HERE
            MessageBox.Show(word);
    }

    private void SearchBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        // Time-consuming operation
        String filename = @"http://www.bankofengland.co.uk/publications/Documents/quarterlybulletin/qb0704.pdf";
        WebClient webClient = new WebClient();
        webClient.DownloadFileAsync(new Uri(filename), @"file.pdf");
        List<String> word_result = new List<String> { "word1", "word2", "word3" };
        e.Result = word_result; // e.result is an Object, and word_result is a List.
    }

    private void SearchBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.searchProgressTimer.Stop();
        this.searchProgressBar.Value = 0;
        this.words = (List<String>)e.Result;
    }   
}

我对为什么发生这种情况的猜测是因为BackgroundWorker线程在主UI线程移至foreach循环之前尚未完成其操作。我想我理解那部分。但是,由于我想在后台线程中执行耗时的操作,因此进度条可以在该操作运行时更新其值,然后在完成后立即使用BackgroundWorker的结果,我该怎么做?

如果标题也不能理解的话,请编辑我的标题。我不确定该如何表达。

参考方案

在该RunWorkerCompleted事件中执行您想做的一切:

private void SearchBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    this.searchProgressTimer.Stop();
    this.searchProgressBar.Value = 0;
    this.words = (List<String>)e.Result;

    foreach (String word in this.words) // BREAKPOINT HERE
        MessageBox.Show(word);
}

由于您是从后台工作人员那里获得此信息的,所以知道您拥有列表的唯一方法是工作人员完成工作。

string.split(“ _(B”) - java

基本上,这行代码行不通,我不确定原因: String[] stringHolder = string.split("_(B"); 我收到此错误:索引3附近的未封闭组此行代码有效: String[] stringHolder = string.split("_B"); 因此,这使我相信它是由“(”引起的。有人可以告诉我如…

jQuery删除和$(this) - php

我在remove()方法上遇到问题。我无法删除$(this)对象。我的代码是:$(".submit_add_type").live("click", function() { var parent = $(this).parent(); var type_value = parent.children('.t…

为什么要使用Func <string>而不是string? - c#

为什么要使用Func<string>而不是string?我的问题特别是关于this回购。有问题的行是22: private static Func<string> getToken = () => Environment.GetEnvironmentVariable("GitHubToken", Enviro…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…