あなたのコードはWindowsフォームに関係すると思います。
UIスレッドで何かを非同期に実行する必要がある場合は、BeginInvoke
を呼び出します。ほとんどの場合、コントロールのプロパティを変更します。
大まかに言うと、これは、デリゲートを定期的に実行されているいくつかのプロシージャに渡すことで達成されます。 (メッセージループ処理とそのようなもの)
Delegate
タイプの場合はBeginInvoke
が呼び出された場合、デリゲートは単に非同期に呼び出されます。
(同期バージョンInvoke
。)
あなたがWPFとWinFormsのために完璧に動作し、より普遍的なコードをしたい場合は、タスク並列ライブラリと応じcontextでTask
を実行することを検討することができます。 (TaskScheduler.FromCurrentSynchronizationContext()
)
もう少し先に述べたように追加してください: Lambdasは匿名メソッドまたはexpressionsとして扱うことができます。
それで、lambdasでvar
を使うことはできません:コンパイラはヒントが必要です。
UPDATE:
これは、あなたが他のスレッドからタスクを開始した場合の.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);
を必要とし、そのcompletition task.Wait()
を待つ必要までスレッドを呼び出すブロックしますタスクの終了。
タスクhereについて詳しく読む。
1つの投稿に多くの異なる質問があります... - 少なくとも3つの別々の質問があります – Prokurors
http://mark-dot-net.blogspot.com.uy/2014/07この記事もご覧ください/six-ways-to-initiate-tasks-on-another.html –