后台工作者没有返回值

Background worker isn't returning a value

我找不到下面的代码有什么问题。由于 Parallel.For 正在冻结表格,因此我使用了后台工作者。但是,它不 return 字符串 如预期。此外,我不确定如何在 backgroundworker 中使用进度条报告。我认为我不需要变量 int i;但没有它,我无法报告进度。

private string trdoc(string str)
        {
            string alltrdoc;
            var alldoc = str.Split('\n');
            string[] alltrdoc1 = new string[alldoc.Length];
            pb1.Maximum = alldoc.Length;//progressbar
            pb1.Value = 0;

            int i = 0;

            BackgroundWorker bw = new BackgroundWorker();

            // this allows our worker to report progress during work
            bw.WorkerReportsProgress = true;

            // what to do in the background thread
            bw.DoWork += new DoWorkEventHandler(
            delegate (object o, DoWorkEventArgs e)
            {

                Parallel.For(0, alldoc.Length, new ParallelOptions { MaxDegreeOfParallelism = 4 },
                index =>
                {
                   alltrdoc1[index] = translate(alldoc[index]);

           bw.ReportProgress(i++);
                });

                e.Result = alltrdoc1;

            });

            bw.ProgressChanged += new ProgressChangedEventHandler(
        delegate (object o, ProgressChangedEventArgs e)
        {

            if (pb1.Value <= pb1.Maximum)
            {
                pb1.Value++;
            }
        });

            // what to do when worker completes its task (notify the user)
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
            delegate (object o, RunWorkerCompletedEventArgs e)
            {
                alltrdoc1 = e.Result as string[];
            });

            bw.RunWorkerAsync();
            alltrdoc = string.Join(Environment.NewLine, alltrdoc1);
            saveposcdic();
            return alltrdoc;

        }

您的 trdoc() 方法的结尾是您当前实现中的问题所在:

bw.RunWorkerAsync();
alltrdoc = string.Join(Environment.NewLine, alltrdoc1);
saveposcdic();
return alltrdoc;

bw.RunWorkerAsync returns 立即,所以 alltrdoc 将是一个空字符串。 alltrdoc1 数组仅在 RunWorkerCompleted 执行后才完全填充。您可以在那里创建 alltrdoc 并继续。