Ich habe eine einfache Konsolenanwendung, die den Fortschritt der Standardausgabe meldet. Zum Beispiel:Wie aktualisiere ich ein WPF-Steuerelement basierend auf der Konsolenausgabe eines Prozesses?
static void Main(string[] args)
{
for (int i = 0; i <= 100; i += 10)
{
Console.WriteLine(i);
System.Threading.Thread.Sleep(1000);
}
}
die diese Ausgabe erzeugt:
0
10
20
30
40
50
60
70
80
90
100
möchte ich nennen diese Anwendung über eine .NET Process
, und aktualisieren Sie eine WPF-Steuerelement (ProgressBar, speziell) asynchron:
private void Run()
{
Process process = new Process();
process.StartInfo.FileName = "ConsoleApplication1.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
{
if (e.Data != null)
{
Console.WriteLine(e.Data);
ProgressBar.Value = double.Parse(e.Data);
}
});
process.Start();
process.BeginOutputReadLine();
process.WaitForExit();
process.Close();
}
Wenn ich dies ausführen schreibt es auf die Konsole ohne Problem, aber verständlicherweise beschwert sich über ProgressBar von einem anderen Thread zuzugreifen, so dass ich es mit wickeln Ein Aufruf:
Application.Current.Dispatcher.Invoke(() =>
{
ProgressBar.Value = double.Parse(e.Data);
});
Allerdings friert es ein, wenn es die Invoke trifft. Vermutlich kommt es zu einem Deadlock, obwohl ich nicht verstehe warum.
Umsehen, es scheint wie Process.SynchronizingObject
wurde entwickelt, um diese Situationen zu beheben, aber ich kann nicht sehen, wie man es von WPF verwenden, da die Steuerelemente keine ISynchronizeInvoke
Eigenschaft haben.
Wenn Sie etwas wie public System.Windows.Threading deklarieren.Dispatcher dispatch = System.Windows.Threading.Dispatcher.CurrentDispatcher; 'Wenn die Anwendung initialisiert wird und diesen Dispatcher verwendet, ändert sich das Verhalten? – pay
@pay: Keine Änderung, egal, ob ich 'dispatch' in' MainWindow' oder 'App' stecke. –
Hm, also selbst wenn der Dispatcher auf dem UI-Thread erstellt wurde, ist es immer noch Deadlocks? Vielleicht auch aus dem Inneren des Event-Handlers entfernen. – pay