C# 相互運用機能を備えたネイティブ C DLL を使用しています。関数ポインターとしてネイティブ DLL にデリゲートを渡します。ネイティブ DLL が何らかのイベントについて通知する必要がある場合、C# でメソッドが呼び出されます。次に、フォームの TextBox を更新したいと思います。これにより、通常の .NET のみのクロススレッド操作では発生しない予期しない問題が発生します。C DLL のネイティブ スレッドからフォームの TextBox を更新するにはどうすればよいですか?
私は試した:
// Dumb approach
// causes Exception - Cross Thread Operation on GUI - expected
textBox1.Text = "some text";
// Invoke approach
// causes Exception (Cross Thread Operation on GUI)
textBox1.Invoke(new AddTextDelegate(AddText), new object[] { text });
// SynchronizationContext approach
// causes unhandled win32 exception with no call stack an no way to debug
context.Post(new SendOrPostCallback(delegate { eventHandler(this, args); }), null);
// My own .NET thead approach
// causes unhandled win32 exception with no call stack an no way to debug
Thread thread = new Thread(new ParameterizedThreadStart(LogMethod));
thread.Start(text);
.NET スレッドが関係している場合は最初の例外を除いてすべてうまくいきますが、ネイティブ DLL からのスレッドが関係している場合は失敗します。