gpt4 book ai didi

c# - Invoke() 和 BeginInvoke() 有什么区别

转载 作者:IT王子 更新时间:2023-10-29 03:27:49 25 4
gpt4 key购买 nike

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

主要是每一个的用途。

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

最佳答案

你是说 Delegate.Invoke/BeginInvoke 还是 Control.Invoke/BeginInvoke

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

Tim 的回答提到了您何时可能想要使用 BeginInvoke - 尽管我怀疑它主要针对 Delegate.BeginInvoke

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

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 窗体团队已保证您可以以“即发即忘”的方式使用 Control.BeginInvoke - 即无需调用 EndInvoke。一般来说,异步调用并非如此:通常每个 BeginXXX 都应该有一个相应的 EndXXX 调用,通常在回调中。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com