C# 背景工作者不在';t返回一个值

C# 背景工作者不在';t返回一个值,c#,backgroundworker,C#,Backgroundworker,我无法找出下面代码中的错误。由于Parallel.For正在冻结表单,因此我使用了一个backgroundworker。但是,它不会返回字符串 如预期的那样。另外,我不确定如何在backgroundworker中使用ReportforProgressBar。我不认为我需要变量int I;但是没有它,我就无法报告进展情况 private string trdoc(string str) { string alltrdoc; var a

我无法找出下面代码中的错误。由于Parallel.For正在冻结表单,因此我使用了一个backgroundworker。但是,它不会返回字符串 如预期的那样。另外,我不确定如何在backgroundworker中使用ReportforProgressBar。我不认为我需要变量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(字符串str)
{
字符串alltrdoc;
var alldoc=str.Split('\n');
字符串[]alltrdoc1=新字符串[alldoc.Length];
pb1.max=alldoc.Length;//progressbar
pb1.值=0;
int i=0;
BackgroundWorker bw=新的BackgroundWorker();
//这允许我们的员工在工作期间报告进度
bw.WorkerReportsProgress=true;
//在后台线程中执行什么操作
bw.DoWork+=新DoWorkEventHandler(
委托人(对象o、对象e)
{
Parallel.For(0,alldoc.Length,新的ParallelOptions{maxdegreeofpparallelism=4},
索引=>
{
alltrdoc1[index]=翻译(alldoc[index]);
bw.ReportProgress(i++);
});
e、 结果=alltrdoc1;
});
bw.ProgressChanged+=新的ProgressChangedEventHandler(
委托(对象o,ProgressChangedEventArgs e)
{
如果(pb1.Valuetrdoc()方法的结尾是当前实现中的问题所在:

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

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

parallel.for已在执行多步处理。您不需要后台worker.parallel.for冻结表单GUI。可能是因为翻译方法的e。请与调试器检查它冻结的代码的哪一部分。翻译方法使用大约10种不同的方法,并从包含400000多个单词的多个词典中搜索30000多个单词来处理字符串。我认为使用backgroundworker不会同时冻结表单,因此我可以更新progressbar控件。问题是您的
trdoc
方法是一个同步方法,因此无论它在内部做什么,它都会阻止GUI,直到它返回。请注意,
Parallel。For
也是一个阻止调用:它并行执行其工作,因此可能完成得更快,但它仍然只在所有工作完成后返回。在本cas中e您可能希望直接使用任务,并让
trdoc
返回一个
Task
。当我添加alltrdoc=string.Join(Environment.NewLine,alltrdoc1)时;对于bw.completed,返回alltrdoc时出错;表示我使用了未分配的局部变量。我如何解决此问题?我不太擅长编程…是的,我已将alltrdoc添加到类级别,您的解决方案几乎奏效。问题是,返回alltrdoc;在bw完成后不会返回alltrdoc。因此我必须运行trdoc();方法两次以获取richtextbox控件上显示的转换值。我无法将return alltrdoc;放在bw.completed中,因为它将给出错误。