これについて説明していただけますか。
someformobj.BeginInvoke((Action)(() =>
{
someformobj.listBox1.SelectedIndex = 0;
}));
具体的にどのように使えばよいか教えていただけないbegininvoke
でしょうか? タイプとはAction
?空白の括弧があるのはなぜ()
ですか? これはどういう意味=>
ですか?
これについて説明していただけますか。
someformobj.BeginInvoke((Action)(() =>
{
someformobj.listBox1.SelectedIndex = 0;
}));
具体的にどのように使えばよいか教えていただけないbegininvoke
でしょうか? タイプとはAction
?空白の括弧があるのはなぜ()
ですか? これはどういう意味=>
ですか?
Action
は、.NETFrameworkによって提供されるデリゲートの一種です。パラメータのAction
ないメソッドを指し、値を返しません。
() =>
ラムダ式の構文です。ラムダ式は型ではありませんDelegate
。Invoke require Delegate
soAction
を使用してラムダ式をラップし、期待さType
れるInvoke()
Invoke
Action
コントロールのウィンドウハンドルを作成したスレッドで実行されると言われます。を避けるために、スレッドの変更が必要になることがよくありExceptions
ます。たとえば、最初にInvokeを呼び出さずに、Invokeが必要なときにRtf
プロパティを設定しようとすると、例外がスローされます。Invokeを呼び出す前に確認してください。RichTextBox
Cross-thread operation not valid
Control.InvokeRequired
BeginInvoke
の非同期バージョンですInvoke
。非同期とは、ブロックしている同期呼び出しとは対照的に、スレッドが呼び出し元をブロックしないことを意味します。
あなたのコードは Windows フォームに関連していると思います。UI スレッドで何かを非同期に実行する必要がある場合は、
呼び出します。ほとんどの場合、コントロールのプロパティを変更します。
大まかに言えば、これは、定期的に実行されている何らかのプロシージャにデリゲートを渡すことによって達成されます。(メッセージのループ処理など)BeginInvoke
BeginInvoke
typeに対して が呼び出された場合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()
、タスクの終了までスレッドの呼び出しがブロックされます。
タスクの詳細については、こちらをご覧ください。