你能为我解释一下这个:
someformobj.BeginInvoke((Action)(() =>
{
someformobj.listBox1.SelectedIndex = 0;
}));
你能告诉我怎样才能使用begininvoke
到底是什么? 什么是Action
类型? 为什么会出现空白的括号()
而这是什么意思=>
你能为我解释一下这个:
someformobj.BeginInvoke((Action)(() =>
{
someformobj.listBox1.SelectedIndex = 0;
}));
你能告诉我怎样才能使用begininvoke
到底是什么? 什么是Action
类型? 为什么会出现空白的括号()
而这是什么意思=>
Action
是由.NET Framework提供的委托的类型。 该Action
指向不带参数的方法,并没有返回值。
() =>
是λ表达式语法。 Lambda表达式的类型不是Delegate
。 调用需要Delegate
所以Action
可用于包裹lambda表达式和提供预期的Type
来Invoke()
Invoke
使上述Action
,以创建控件的窗口句柄的线程上执行。 更改线程往往是必要的,以避免Exceptions
。 例如,如果一个人试图设置Rtf
财产上RichTextBox
时的调用是必要的,而无需先调用调用,然后Cross-thread operation not valid
,将引发异常。 检查Control.InvokeRequired
调用调用之前。
BeginInvoke
是异步版本Invoke
。 异步表示线程不会阻塞调用者,而不是被阻塞同步调用。
我想你的代码涉及到Windows窗体。
你叫BeginInvoke
,如果你需要的东西是在UI线程异步执行的:在大多数的情况下,改变控件的属性。
粗略地说,这是实现被传递到代表正被周期性地执行一些步骤。 (消息循环处理和类似的东西)
如果BeginInvoke
被称为对Delegate
类型的委托才刚刚异步调用。
( Invoke
用于同步版本)。
如果你想这完全适用于WPF和WinForms更普遍的代码,你可以考虑任务并行库和运行Task
与根据上下文 。 ( TaskScheduler.FromCurrentSynchronizationContext()
并增加一点已经被别人说:Lambda表达式可以这样对待匿名方法或表达 。
这就是为什么你不能只用var
与lambda表达式:编译器需要一个暗示。
更新:
这需要的.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()
会阻塞调用线程,直到任务结束。
了解更多关于任务在这里 。