捕获来自进程的输出流并在简单窗口中显示

时间:2012-02-06 17:26:31

标签: c# backgroundworker progress ui-thread

我有点难过。我以前和背景工作者一起工作过,并且在我的应用程序中的许多位置都有它们。为了显示正在发生的事情的“进展”,但是使用措辞而不仅仅是“完成百分比”,我创建了一个简单的“窗口”。在这个窗口中,我有一个简单的标签。由于后台工作线程与UI线程的问题,我无法直接访问,所以我在Window上有一个“setter”,只做

public string NewStatus
{
   set { this.lblWindowShowStatus.Content = value; }
}

因此,当BGW“ReportsProgress”并将任何消息传递给窗口的“NewStatus”setter(因此它在正确的UI线程上运行)。如果后台工作人员在C#.Net应用程序中执行某些操作,这一切都完美且没有问题。

接下来......我需要运行带有一些命令参数的DOS命令,但不想看到丑陋的黑色窗口。所以,从其他线程,我已经找到并完美地完成了这部分工作。没问题。所以,在这一点上,两个元素之间的所有语法和功能(窗口与后台工作者刷新状态)和(调用DOS命令来运行一些参数化实用程序)。

现在,问题。尝试在运行DOS命令时刷新窗口状态。因此,这使我暴露于“OutputDataReceived”以一次重定向输出和捕获线(这是完美的)。

oDOSCall.StartInfo.RedirectStandardOutput = true;
oDOSCall.OutputDataReceived += DOSOutputHandler;

// start for process and wait asynchronously until finished...
oDOSCall.Start();

// NOW begin async read of output stream
oDOSCall.BeginOutputReadLine();

oDOSCall.WaitForExit();

然后在DOSOutputHandler中,我有

private void DOSOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
   // Collect the sort command output.
   if (!String.IsNullOrEmpty(outLine.Data))
   {
      string txtData = outLine.Data;

      // pass on to the WINDOW directly
      oWnd.NewSubStatus = txtData;
   }
}

这只是挂起并且永远不会对UI线程上的窗口执行更新。所以,我认为...尝试将DOS命令包装到一个BGW线程中...所以,我做...几乎所有相同的,所以,从我正在捕获其输出流的DOS命令,BGW线程得到它。然后我尝试将该字符串值转发到Window状态,但它似乎挂起...几乎像UI线程一样,调用一个BGW线程,它调用一个进程(它自己的新线程)不想好好玩。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

不使用流,而是尝试使用输出事件!

我在这里回答我自己的问题:
Controling cmd.exe from Winforms