2016-03-28 11 views
-1

ich nicht erklären kann meine eigenen Worte mit, also hier die Situation:Cross-Thread-Fehler

myBindingSource.Add(new myElement()); 
SetDataSource(myBindingSource); 
myBindingSource.Add(new myElement()); 

ich immer eine Ausnahme fangen (a verkanten Ausnahme) auf dem zweiten Aufruf von Add. Hier ist die SetDataSource void:

delegate void SetDataSourceCallback(BindingSource db); 
private void SetDataSource(BindingSource db) 
{ 
     if (myDataGridView.InvokeRequired) 
     { 
      SetDataSourceCallback d = new SetDataSourceCallback(SetDataSource); 
      myDataGridView.Invoke(d, new object[] { db }); 
     } 
     else 
     { 
      myDataGridView.DataSource = db; 
     } 
} 

Ich kann nicht verstehen, warum das passiert so weiter!

+0

Es ist nicht zulässig, eine Datenquelle von einem Worker-Thread zu aktualisieren. Sie benötigen ebenfalls eine ClearDataSource() -Methode, damit Sie die Eigenschaft myDataGridView.DataSource auf null zurücksetzen können. –

+0

Verwenden Sie diese Antwort: Rufen Sie den Dispatcher des WPF/UI-Hauptthreads auf: http://stackoverflow.com/questions/11625208/accessing-ui-main-thread-safely-in-wpf –

Antwort

1

Verwenden Sie den Dispatcher des Haupt-UI-Threads, um jeden UI-Code von einem anderen Thread sicher aufzurufen.

Mit WPF können Sie keinen UI-Status von einem anderen Thread als dem "Haupt" -UI-Thread ändern. Wenn Sie also einen Status haben, der die Benutzeroberfläche ändert, sollten Sie sie im Allgemeinen mit dem Dispatcher.Invoke-Code umbrechen.

Application.Current.Dispatcher.Invoke(new Action(() => { 
    myBindingSource.Add(new myElement()); 
    SetDataSource(myBindingSource); 
    myBindingSource.Add(new myElement()); 
})); 
+2

Während ich Ihre Antwort mag, könnten Sie fügen Sie eine detailliertere Erklärung hinzu, warum dies notwendig ist. Ich denke, es würde die Frage besser beantworten und Ihre Antwort hervorheben. –