Я немного озадачен.Я работал с фоновыми работниками раньше, и они есть во многих местах моего приложения.Чтобы показать «прогресс» происходящего, но с использованием словоблудия вместо просто «% завершения», я создал простое «окно».В этом окне у меня есть простой ярлык.Из-за проблем фоновых рабочих потоков против потока пользовательского интерфейса я не могу получить прямой доступ, поэтому у меня есть «установщик» в окне, который не делает ничего, кроме
public string NewStatus
{
set { this.lblWindowShowStatus.Content = value; }
}
Итак, когда BGW «ReportsProgress»"и передает любое сообщение установщику окна" NewStatus "(поэтому он работает в соответствующем потоке пользовательского интерфейса).Это все работает отлично и без проблем ... при условии, что фоновый работник делает что-то в приложении 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;
}
}
Это просто зависает и никогда не выполняет обновление окна в потоке пользовательского интерфейса.Итак, я думаю ... попробуйте обернуть команду DOS в поток BGW ... Итак, я делаю ... почти все идентичные, поэтому, из команды DOS, которую я собираю в свой выходной поток, поток BGW получает ее,Затем я пытаюсь переслать это строковое значение до состояния окна, но оно кажется зависшим ... Почти как поток пользовательского интерфейса, вызывающий поток BGW, который вызывает процесс (новый собственный поток) не хочетиграть хорошо.
Есть идеи?