아래 코드에서 무엇이 잘못되었는지 알 수 없습니다. Parallel.For가 양식을 고정시키고 있기 때문에 배경 작업자를 사용했습니다. 그러나 문자열은 의도 한대로 을 반환하지 않습니다. 또한 backgroundworker에서 progressbar에 대한 보고서를 사용하는 방법에 대해 잘 모르겠습니다. 변수 int i가 필요 없다고 생각합니다. 그러나 그것 없이는, 나는 진전을보고 할 수 없다.배경 작업자가 값을 반환하지 않습니다.
bw.RunWorkerAsync();
alltrdoc = string.Join(Environment.NewLine, alltrdoc1);
saveposcdic();
return alltrdoc;
bw.RunWorkerAsync가 즉시 반환, 그래서 alltrdoc은 빈 문자열입니다 : 문제가 현재의 구현입니다
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;
}
parallel.for는 이미 다중 밟기를하고 있습니다. 당신은 배경 작업자가 필요 없습니다. –
Parallel.for가 양식 GUI를 고정시킵니다. 아마도 번역 방법 때문에. – user1785594
디버거를 사용하여 코드의 어느 부분이 고정되는지 확인하십시오. –