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

主要是每个人的用途。

编辑:创建线程对象与调用该对象和仅在委托(delegate)上调用BeginInvoke()之间有什么区别?还是他们是同一回事?

最佳答案

您是指Delegate.Invoke/BeginInvoke还是Control.Invoke/BeginInvoke吗?

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

  • 蒂姆的答案提到了您可能想使用BeginInvoke的时间-尽管我怀疑它主要是针对Delegate.BeginInvoke的。

    对于Windows Forms应用程序,我建议您通常应使用BeginInvoke。这样,您就不必担心死锁了-但是您需要了解,在下次查看UI时可能尚未更新UI!特别是,您不应修改UI线程可能要用于显示目的的数据。例如,如果您具有具有PersonFirstName属性的LastName,则可以执行以下操作:
    person.FirstName = "Kevin"; // person is a shared reference
    person.LastName = "Spacey";
    control.BeginInvoke(UpdateName);
    person.FirstName = "Keyser";
    person.LastName = "Soze";
    

    然后,UI可能最终会显示“Keyser Spacey”。 (有一个外部机会可能会显示“Kevin Soze”,但只能通过内存模型的怪异来显示。)

    但是,除非您遇到此类问题,否则Control.BeginInvoke更容易解决,并且可以避免后台线程无缘无故地等待。请注意,Windows Forms团队已保证您可以“即发即弃”的方式使用Control.BeginInvoke,即无需调用EndInvoke。通常,异步调用不是这样:通常每个BeginXXX应该在回调中都有一个对应的EndXXX调用。

    关于c# - Invoke()和BeginInvoke()有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/229554/

    10-11 15:56