2017-10-08 2 views
2

Ich bin verwirrt über die Unterschiede zwischen Dispatcher.CurrentDispatcher.BeginInvoke und BeginInvokeWarum die Verwendung von Dispatcher.CurrentDispatcher.BeginInvoke meine GUI nicht aktualisiert, aber BeginInvoke verwendet?

ich den folgenden Teil des Codes haben, die nicht funktioniert, wird der Code in UpdateCounts Methode ignoriert:

private void Start() 
{ 
    _testResults = new TestResults(ModelNameTextBox.Text); 
    _timer = new System.Threading.Timer(UpdateCounts, null, 0, 500);    
} 

private void UpdateCounts(object info) 
{ 
    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => 
    { 
     PassCountLabel.Text = _testResults.PassedCount.ToString(); 
     RequestCountLabel.Text = _testResults.RequestedCount.ToString();     
    })); 
} 

Aber sobald Dispatcher.CurrentDispatcher entfernen, es funktioniert gut:

private void UpdateCounts(object info) 
{ 
    BeginInvoke(new Action(() => 
    { 
     PassCountLabel.Text = _testResults.PassedCount.ToString(); 
     RequestCountLabel.Text = _testResults.RequestedCount.ToString();     
    })); 
} 
+2

Sie können WPF und Winforms Code nicht beliebig mischen. Ihr Einstiegspunkt Main() scheint die Winforms-Version von Application.Run() zu verwenden. Wenn Dispatcher verwendet wird, kann kein Code ausgeführt werden, da in der App keine Dispatcher-Schleife vorhanden ist. Wenn dies * absichtlich * ist, das heißt, dieser Code befindet sich in einer Bibliothek und Sie können nicht davon ausgehen, dass es eine WPF- oder WinForms-App ist, die die Bibliothek verwendet, dann müssen Sie es sehr unterschiedlich machen. Sie müssen SynchronizationContext.Current im Konstruktor kopieren. Aber auch das Aktualisieren von Steuerelementen in einer Bibliothek ist schlecht. Nicht mischen. –

Antwort

0

DieDispatcher.CurrentDispatcher.BeginInvokefunktioniert nur, wenn Sie es aus dem UIhread aufrufen, wenn es nicht den aktuellen Thread aufruft.

Sie haben verwendenApplication.Current.Dispatcher den UI-Thread zu nennen.

Verwandte Themen