猿问

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

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

只是想知道BeginInvoke()Invoke()是?

主要是用来做什么的。

编辑:创建线程对象和调用对象与仅仅调用BeginInvoke()代表?还是他们是一样的?


蓝山帝景
浏览 2169回答 3
3回答

鸿蒙传说

您的意思是代表.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调用,通常是在回调中。

慕虎7371278

在JonSkeet的答复的基础上,有时您希望调用委托并等待它的执行完成,然后才能继续当前线程。在这些情况下,调用就是您想要的。在多线程应用程序中,您可能不希望线程等待委托完成执行,特别是如果委托执行I/O(这可能会使委托和线程块)。在这种情况下,BeginInvoke将是有用的。通过调用它,可以让委托启动,但是线程可以与委托并行执行其他事情。使用BeginInvoke会增加代码的复杂性,但有时性能的改进值得这样做。

犯罪嫌疑人X

之间的区别Control.Invoke()和Control.BeginInvoke()是,BeginInvoke()将调度GUI线程上的异步操作。调度异步操作时,代码将继续。过了一段时间(您不知道确切的时间),您的异步操作将被执行。Invoke()将执行异步操作(在GUI线程上),并等待操作完成。一个合乎逻辑的结论是,您传递给的委托Invoke()可以具有out参数或返回值,而将委托传递给BeginInvoke()不能(必须使用EndInvoke检索结果)。
随时随地看视频慕课网APP
我要回答