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

只是想知道BeginInvoke()Invoke()之间的区别是什么?

主要是每个人会用什么。

编辑:创建一个线程对象和调用调用,并只是调用BeginInvoke()上的BeginInvoke()之间有什么区别? 或者他们是同一个东西?


你的意思是Delegate.Invoke / BeginInvoke或Control.Invoke / BeginInvoke?

  • Delegate.Invoke:在同一个线程上同步执行。
  • Delegate.BeginInvoke:在线程池线程上异步执行。
  • Control.Invoke:在UI线程上执行,但调用线程在继续之前等待完成。
  • Control.BeginInvoke:在UI线程上执行,并且调用线程不会等待完成。
  • Tim的回答提到了你可能想要使用BeginInvoke--尽管它主要面向Delegate.BeginInvoke,我怀疑。

    对于Windows Forms应用程序,我建议你通常应该使用BeginInvoke。 那样的话,你不需要担心死锁,但是你需要明白,下次你看UI的时候用户界面可能没有被更新! 尤其是,您不应修改UI线程可能用于显示目的的数据。 例如,如果您拥有名字和姓氏属性的人员,并且您执行了以下操作:

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

    那么用户界面最终可能会显示“Keyser Spacey”。 (外部机会可能会显示“Kevin Soze”,但只能通过内存模型的怪异表现出来。)

    但是,除非遇到此类问题,否则Control.BeginInvoke更容易正确使用,并且可以避免后台线程不得不等待无理由。 请注意,Windows窗体小组已确保您可以使用Control.BeginInvoke以“即忘即忘”的方式使用 - 即无需调用EndInvoke。 通常情况下,异步调用并非如此:通常每个BeginXXX都应该有相应的EndXXX调用,通常在回调中。


    基于Jon Skeet的回复,有时您想调用委托并等待其执行完成,然后继续执行当前线程。 在这些情况下,Invoke调用就是你想要的。

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

    在这些情况下,BeginInvoke会很有用。 通过调用它,你告诉委托开始,但是你的线程可以自由地与委托并行地做其他事情。

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


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

  • BeginInvoke()将在GUI线程上安排异步操作。 当安排异步操作时,代码会继续。 一段时间后(你不知道什么时候)你的异步操作将被执行
  • Invoke()将执行您的异步操作(在GUI线程上),并等到操作完成。
  • 一个合乎逻辑的结论是,您传递给Invoke()的委托可以具有外部参数或返回值,而传递给BeginInvoke()的委托不能(您必须使用EndInvoke来检索结果)。

    链接地址: http://www.djcxy.com/p/79297.html

    上一篇: What's the difference between Invoke() and BeginInvoke()

    下一篇: How do I run Redis on Windows?