59

これについて説明していただけますか。

someformobj.BeginInvoke((Action)(() =>
{
    someformobj.listBox1.SelectedIndex = 0;
}));

具体的にどのように使えばよいか教えていただけないbegininvokeでしょうか? タイプとはAction?空白の括弧があるのはなぜ()ですか? これはどういう意味=>ですか?

4

2 に答える 2

87

Actionは、.NETFrameworkによって提供されるデリゲートの一種です。パラメータのActionないメソッドを指し、値を返しません。

() =>ラムダ式の構文です。ラムダ式は型ではありませんDelegate。Invoke require DelegatesoActionを使用してラムダ式をラップし、期待さTypeれるInvoke()

InvokeActionコントロールのウィンドウハンドルを作成したスレッドで実行されると言われます。を避けるために、スレッドの変更が必要になることがよくありExceptionsます。たとえば、最初にInvokeを呼び出さずに、Invokeが必要なときにRtfプロパティを設定しようとすると、例外がスローされます。Invokeを呼び出す前に確認してください。RichTextBoxCross-thread operation not validControl.InvokeRequired

BeginInvokeの非同期バージョンですInvoke。非同期とは、ブロックしている同期呼び出しとは対照的に、スレッドが呼び出し元をブロックしないことを意味します。

于 2013-01-17T21:20:17.067 に答える
13

あなたのコードは Windows フォームに関連していると思います。UI スレッドで何かを非同期に実行する必要がある場合は、
呼び出します。ほとんどの場合、コントロールのプロパティを変更します。 大まかに言えば、これは、定期的に実行されている何らかのプロシージャにデリゲートを渡すことによって達成されます。(メッセージのループ処理など)BeginInvoke

BeginInvoketypeに対して が呼び出された場合Delegate、デリゲートは非同期で呼び出されます。
(Invoke同期バージョンの場合)

WPF と WinForms で完全に機能するより汎用的なコードが必要な場合は、Task Parallel Library を検討Taskし、それに応じたコンテキストで実行することを検討してください。( TaskScheduler.FromCurrentSynchronizationContext())

そして、他の人がすでに言ったことに少し追加します。ラムダは、匿名のメソッドまたはのいずれかとして扱うことができます。
そのため、ラムダだけを使用することはできませんvar。コンパイラにはヒントが必要です。

アップデート:

これには .Net v4.0 以降が必要です

// This line must be called in UI thread to get correct scheduler
var scheduler = System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext();

// this can be called anywhere
var task = new System.Threading.Tasks.Task( () => someformobj.listBox1.SelectedIndex = 0);

// also can be called anywhere. Task  will be scheduled for execution.
// And *IF I'm not mistaken* can be (or even will be executed synchronously)
// if this call is made from GUI thread. (to be checked) 
task.Start(scheduler);

他のスレッドからタスクを開始し、その完了を待つ必要がある場合task.Wait()、タスクの終了までスレッドの呼び出しがブロックされます。

タスクの詳細については、こちらをご覧ください。

于 2013-01-17T21:15:13.810 に答える