0

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

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

因此,当通过 BGW“ReportsProgress”并将任何消息传递给窗口的“NewStatus”设置器时(因此它在正确的 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 线程,它正在调用一个进程(它自己的新线程)不想玩的不错。

有任何想法吗?

4

1 回答 1

1

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

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

于 2012-02-06T17:36:48.433 回答