0

バックグラウンドワーカーの助けを借りて、外部exeのコンソールを1行ずつ読んでいます。コンソールの各行をラベルに割り当てています。問題は、ラベルがコンソール ラインで更新されないことです。コードを以下に示します

private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    int i = 0;
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.CreateNoWindow = true;
    startInfo.UseShellExecute = false;
    startInfo.FileName = EXELOCATION;
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;
    startInfo.Arguments = Program.path;
    startInfo.RedirectStandardOutput = true;
    try
    {
        // Start the process with the info we specified.
        // Call WaitForExit and then the using statement will close.
        using (exeProcess = Process.Start(startInfo))
        {
            using (StreamReader reader = exeProcess.StandardOutput)
            {
                string result;
                while ((result = reader.ReadLine()) != null)
                {
                    // object param = result;

                    e.Result = result;
                    bgWorker.ReportProgress(i++);
                }
            }
        }
    }
    catch
    {
        // Log error.
    }
}

private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    label.Text = e.ToString();
    label.Refresh();
}

どうすればこの問題を解決できますか

4

3 に答える 3

2

これを試して:

label2.Invoke(new Action(() => { label2.Text = e.ToString(); }));
label2.Invoke(new Action(() => { label2.Refresh(); }));
于 2013-10-08T12:54:36.740 に答える
0

非 UI スレッド (別名バックグラウンド スレッド) から UI 要素を更新しようとしているため、そのコードはおそらく機能しません。

WPF を使用している場合は、 を使用しDispatcherて、UI スレッドでラベルを変更するように要求する必要があります。別のフレームワークを使用している場合は、そのフレームワークの同等のクラスを試してください。

ProgressChanged メソッドで、代わりにこれを試してください。

Application.Current.Dispatcher.BeginInvoke(
  DispatcherPriority.Background,
  () => {
    label.Text = e.ToString();
  });
于 2013-10-08T12:38:43.373 に答える