2013-10-08 57 views
0

我正在逐行讀取外部exe的控制檯,並藉助背景工作,我將控制檯的每一行分配給標籤。問題是標籤沒有用控制檯線更新。下面使用背景工作進度更新標籤

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(); 
} 

我怎樣才能解決這個問題

+2

你確定這是不是** **發生是不是偶然的,該文件是如此之小,它發生太快? –

+0

這是WinForms還是WPF應用程序? – SWeko

+0

代碼引發此錯誤「此BackgroundWorker指出它不報告進度。修改WorkerReportsProgress以聲明它報告進度」。 – WiXXeY

回答

2

試試這個:

label2.Invoke(new Action(() => { label2.Text = e.ToString(); })); 
label2.Invoke(new Action(() => { label2.Refresh(); })); 
+0

@thanx不是你救了我的一天 – WiXXeY

0

該代碼可能是因爲你想更新從非UI線程(又名後臺線程)的UI元素不起作用代碼中給出。

如果您使用的是WPF,則應該使用Dispatcher來請求在UI線程中更改標籤。如果您正在使用另一個框架,請嘗試該框架的等效類。

在你ProgressChanged方法,試試這個:

Application.Current.Dispatcher.BeginInvoke(
    DispatcherPriority.Background, 
() => { 
    label.Text = e.ToString(); 
    }); 
0

如果這是在另一個線程(和你在一個WinForms應用程序),您可能需要使用Control.InvokeRequired

public void UpdateProgress (int progress) 
{ 
    if (label.InvokeRequired) 
    { 
    this.Invoke(()=> UpdateProgress(progress)); 
    } 
    else 
    { 
    label.Text = progress.ToString(); 
    } 
} 

此方法檢查它是否在UI線程上運行,如果不是,則在UI線程上調用它自己。如果它已經在UI線程上,它只是更新標籤。

-1

BackgroundWorker的屬性WorkerReportsProgress應設置爲true。

此代碼爲我工作

namespace StackOverFlowPracticeWindows 
{ 
    public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void btnTest_Click(object sender, EventArgs e) 
    { 
     backgroundWorker1.RunWorkerAsync(); 
    } 

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

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

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     textBox1.AppendText(e.ToString()); 
    } 
} 
}