WPF アプリケーションで c# コードから c++ dll ライブラリにアクセスします。UIスレッドからdllにアクセスする際に問題はありません。しかし、C++ dll のコードの実行中に UI が応答する必要があります。そのため、別のスレッドからアクセスしようとしています。しかし、非 ui スレッドで初めて同じ関数 (ui スレッドから呼び出す) を呼び出そうとすると、関数は戻りますが、戻り値は関数に内部エラーがあることを示します。しかし、UI 以外のスレッドからコードをさらに 1 回か 2 回実行すると、エラー以外の値が正常に返されます。私はdllのソースコードを持っていないので、内部で何が起こっているのかわかりません。
c++ 関数
UINT32 myfunc1()
C# の場合
[DllImport("mydll.dll")]
public static extern uint myfunc1();
UIスレッドでコードに到達する方法
uint errorCode = myfunc1(); // returns 0 means no error occured
非UIスレッドでコードに到達する方法
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (s, args) => { args.Result = myfunc1(); };
// 1st call args.Result is 10 means internal error ocurred
// 2nd call args.Result is sometimes 0 and sometimes 10
// 3rd or later calls args.Result is 0 means no error occured
worker.RunWorkerCompleted += doSth();
worker.RunWorkerAsync();