9

まず、VS2005とC#2.0を使用しています。

SelectedIndexChangedイベント内からコンボボックスのTextプロパティを設定しようとしています。StackOverflowの別のスレッドから、これは次のように提案されました。

BeginInvoke(new Action(() => someCombobox.Text = "x" )); 

さて、まず第一に、これは私のためにコンパイラエラーを返します。これは、Actionオブジェクトが2つの言語仕様で異なる動作をするためだと思います。C#2.0では、Actionオブジェクトは<T>すべての宣言で構造を必要としているようです。私は間違っているかもしれませんが、それを明確にしてもらいたいと思います。

動作するのは次のとおりです。

BeginInvoke(new Action<string>( delegate { someCombobox.Text = "x"; }), new object[] { "" });

ただし、タイプパラメータを使用してActionオブジェクトを定義する必要があるのは非常に奇妙に思えます(特に、パラメータを渡すつもりがないため)。どういうわけか、このパラメータを削除すると、空の新しいobject []も廃止されます。これは、私が望んでいることです。

誰かが私が上記の呼び出しを単純化するのを手伝ってもらえますか?

最後に、BeginInvokeがSelectedIndexChangedの後に終了し、コンボボックスのTextプロパティが正しいテキストで更新されることが保証されていますか?

これらの質問に対する答えを学んでいただければ幸いです。

4

2 に答える 2

11

独自のアクションデリゲートを定義できます。

delegate void Action()

BeginInvokeを呼び出しているオブジェクトが表示されませんが、コンボボックスと同じスレッドで作成されたUIコントロールの場合、渡されたデリゲートは、SelectedIndexChangedイベントハンドラーが完了した後しばらくすると呼び出されることが保証されます。

于 2009-07-19T04:55:29.993 に答える
10

.NET 2.0では、パラメーターなしのアクションは使用できないと思います。心配する必要はありません。別の事前定義されたデリゲートタイプを使用するだけです。MethodInvokerがその仕事をする必要があります(パラメーターのないvoidメソッド)。

また、BeginInvokeには2つのオーバーロードがあります。1つはデリゲートを受け取り、もう1つはデリゲートとオブジェクトの配列を受け取ります。

BeginInvoke(new MethodInvoker(delegate()
{
    someCombobox.Text = "x";
}));
于 2009-07-19T04:44:24.493 に答える