为了账号安全,请及时绑定邮箱和手机立即绑定

Invoke()和BeginInvoke()之间有什么区别?

Invoke()和BeginInvoke()之间有什么区别?

蓝山帝景 2019-06-18 10:24:13
Invoke()和BeginInvoke()之间有什么区别?只是想知道BeginInvoke()和Invoke()是?主要是用来做什么的。编辑:创建线程对象和调用对象与仅仅调用BeginInvoke()代表?还是他们是一样的?
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

您的意思是代表.Invoke/BeginInvoke或Control.Invoke/BeginInvoke?

  • Invoke:在同一线程上同步执行。
  • BeginInvoke:在线程池线程上异步执行。
  • Control.Invoke:在UI线程上执行,但调用线程在继续之前等待完成。
  • Control.BeginInvoke:在UI线程上执行,调用线程不等待完成。

Tim的回答提到了什么时候您可能想使用BeginInvoke-尽管它主要是针对代表的,我想是BeginInvoke。

对于Windows窗体应用程序,我建议您通常使用BeginInvoke。这样,您就不需要担心死锁,例如-但是您需要了解到下一次查看UI时UI可能还没有更新!特别是,您不应该修改UI线程可能要用于显示的数据。例如,如果您有一个具有FirstName和LastName属性的人,并且您这样做了:

person.FirstName = "Kevin"; // person is a shared referenceperson.LastName = "Spacey";control.BeginInvoke(UpdateName);person.FirstName = 
"Keyser";person.LastName = "Soze";

然后UI很可能会显示“Keyser Spacey”。(它很有可能展示“凯文·索兹”,但只能通过记忆模型的怪异表现。)

但是,除非您有这类问题,Control.BeginInvoke更容易纠正错误,并且可以避免后台线程不必要地等待。请注意,Windows窗体团队已经保证您可以使用Control.BeginInvoke以“失火和遗忘”的方式-即不调用EndInvoke。通常情况下,异步调用不是这样的:通常每个BeginXXX都应该有一个相应的EndXXX调用,通常是在回调中。


查看完整回答
反对 回复 2019-06-18
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

在JonSkeet的答复的基础上,有时您希望调用委托并等待它的执行完成,然后才能继续当前线程。在这些情况下,调用就是您想要的。

在多线程应用程序中,您可能不希望线程等待委托完成执行,特别是如果委托执行I/O(这可能会使委托和线程块)。

在这种情况下,BeginInvoke将是有用的。通过调用它,可以让委托启动,但是线程可以与委托并行执行其他事情。

使用BeginInvoke会增加代码的复杂性,但有时性能的改进值得这样做。


查看完整回答
反对 回复 2019-06-18
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

之间的区别Control.Invoke()Control.BeginInvoke()是,

  • BeginInvoke()

    将调度GUI线程上的异步操作。调度异步操作时,代码将继续。过了一段时间(您不知道确切的时间),您的异步操作将被执行。
  • Invoke()

    将执行异步操作(在GUI线程上),并等待操作完成。

一个合乎逻辑的结论是,您传递给的委托Invoke()可以具有out参数或返回值,而将委托传递给BeginInvoke()不能(必须使用EndInvoke检索结果)。


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 2168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信