別のスレッドからGUIを更新する際のこの質問に従った後、プロパティの割り当て以外で機能するようにコードを少し拡張したいと思いました。具体的には、必要に応じて動作を定義できるように、いくつかの機能をラムダに直接割り当てる方法を見つけようとしていました(WPF用にオリジナルを少し変更しました)。
private delegate void UpdateControlThreadSafeDelegate(Control control, System.Linq.Expressions.Expression<Action> property);
public void UpdateControl(Control control, System.Linq.Expressions.Expression<Action> property)
{
// If calling thread is not associated with control dispatcher, call our thread safe property update delegate
if (!control.Dispatcher.CheckAccess())
{
control.Dispatcher.Invoke(new UpdateControlThreadSafeDelegate(UpdateControl), new object[] { control, property });
}
else
{
Action call = property.Compile();
call();
}
}
使用法:
UpdateControl(lbFoo, () => lbFoo.Items.Clear()); // where lbFoo is a ListBox control
これは正常に機能します。しかし、私はむしろ次のようなことを許可したいと思います。
UpdateControl(lbFoo, () => { lbFoo.Items.Clear(); lbFoo.Items.Add("Bar");});
これは機能せず、エラーCS0834を返します。ステートメント本体を持つラムダ式を式ツリーに変換できません。エラーは明らかです。どのように進めるのが最善かはわかりません。私は元の使用法に従い、必要なことを数行で行うことができましたが、それはそれほど整頓されていません。
私がやりたいことをするためのより良い/より簡単な方法があると思います。