我有点难过。我以前曾与后台工作人员合作过,并且在我的应用程序中的许多位置都有他们。为了显示正在发生的事情的“进度”,但使用措辞而不是仅仅“完成百分比”,我创建了一个简单的“窗口”。在这个窗口中,我有一个简单的标签。由于后台工作线程与 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 线程,它正在调用一个进程(它自己的新线程)不想玩的不错。
有任何想法吗?