私はWPFに少し慣れていません。WPFとそのスレッドモデルを実験している間、私はいくつかの実験を試みました。
MainWindow.xaml.csで次のコード行を実行しました。
var sync = SynchronizationContext.Current;
//System.Windows.Threading.DispatcherSynchronizationContextを返します//
var frm = new System.Windows.Form();
IntPtr temp = frm.Handle;
sync = SynchronizationContext.Current;
//同期はSystem.Windows.Threading.DispatcherSynchronizationContextです。したがって、SynchronizationContext.Currentがnullの場合、System.Windows.FormはSystem.Windows.Forms.WindowsFormsSynchronizationContextを作成すると思います。//
//ここで奇妙な部分があります。
Thread th = new Thread(() =>
{
Action strac = UpdateTextBox;
frm.BeginInvoke(strac);
});
th.Start();
void UpdateTextBox()
{
textBox1.Text = "Abhik";
}
// System.Windows.FormのBeginInvokeを使用して、リクエストをUIスレッドにマーシャリングし、UIコントロールを更新しようとしました。
機能した!!..
なぜそれが機能したのか誰かに教えてもらえますか?これは、WPFコントロールとwinformコントロールがWindows OSで同じ祖先を共有しているためです。つまり、User32.dllとDispatcherSynchronizationContextおよびWindowsFormsSynchronizationContextは内部で同じことを行います。
どんな助けでもありがたいです。