2013-10-08 2 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

Этого код, вероятно, не работает, потому что вы пытаетесь обновить элемент пользовательского интерфейса из потока без пользовательского интерфейса (так называемого фонового потока).

Если вы используете WPF, вы должны использовать Dispatcher, чтобы запросить замену этикеток в потоке пользовательского интерфейса. Если вы используете другую фреймворк, попробуйте эквивалентный класс этой среды.

В вашем методе 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(); 
    } 
} 

Этот метод проверяет, запущен ли он в потоке пользовательского интерфейса, а если нет, он вызывает себя в потоке пользовательского интерфейса. Если он уже включен в поток пользовательского интерфейса, он просто обновляет метку.

-1

Рабочий объект BackgroundWorkerReportsProgress должен быть установлен в 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()); 
    } 
} 
} 
Смежные вопросы