これは、この質問のフォローアップです。
別のスレッドからObservableCollectionを更新する必要があります。私は次のコードでそれを試しました:
Thread t = new Thread( ()=>
{
while(true)
{
if (ErrorDetection.ErrorDetectionIO.doErrorDetection() == 1)
{
dataLine = ErrorDetection.ErrorDetectionIO.getDataLine();
if (mainWindow != null)
{
ISynchronizeInvoke target = mainWindow; // mainWindow needs to be an WindowsForm?
target.Invoke(
(Action)(() =>
{
mainWindow.setNewDataLine(dataLine);
}
), null);
}
}
}
} );
t.IsBackground = true;
t.Start();
ErrorDetectionIO.doErrorDetection()はc ++ / cli .dllにあり、ネイティブcコードを呼び出します。
setNewDataLineはmainWindowにあり、Observableコレクションに行を追加します。
別のスレッドから呼び出された場合、例外が発生します。「このタイプのCollectionViewは、Dispatcherスレッドとは異なるスレッドからのSourceCollectionへの変更をサポートしていません。」
問題は、ISynchronizeInvokeがwpfで機能しないように見えることです。mainWindowをISynchronizeInvokeに変換できないというコンパイラエラーメッセージが表示されます。
ISynchronizeInvokeを使用する場合target=mainWindow as ISynchronizeInvoke; コンパイルできますが、ターゲットはnullです。