-->

如何使用的BeginInvoke C#(How to use BeginInvoke C#)

2019-07-18 08:42发布

你能为我解释一下这个:

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

你能告诉我怎样才能使用begininvoke到底是什么? 什么是Action类型? 为什么会出现空白的括号() 而这是什么意思=>

Answer 1:

Action是由.NET Framework提供的委托的类型。 该Action指向不带参数的方法,并没有返回值。

() =>是λ表达式语法。 Lambda表达式的类型不是Delegate 。 调用需要Delegate所以Action可用于包裹lambda表达式和提供预期的TypeInvoke()

Invoke使上述Action ,以创建控件的窗口句柄的线程上执行。 更改线程往往是必要的,以避免Exceptions 。 例如,如果一个人试图设置Rtf财产上RichTextBox时的调用是必要的,而无需先调用调用,然后Cross-thread operation not valid ,将引发异常。 检查Control.InvokeRequired调用调用之前。

BeginInvoke是异步版本Invoke 。 异步表示线程不会阻塞调用者,而不是被阻塞同步调用。



Answer 2:

我想你的代码涉及到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()会阻塞调用线程,直到任务结束。

了解更多关于任务在这里 。



文章来源: How to use BeginInvoke C#