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

主要是每一个都是用来做什么的.

编辑:创建一个线程对象,并对其调用invoke,与对一个委托调用BeginInvoke()有什么区别?或者他们是同一件事?

推荐答案

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

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

蒂姆的答案提到了什么时候你可能想要使用BeginInvoke--尽管我怀疑它主要是针对Delegate.BeginInvoke的.

对于Windows窗体应用程序,我建议您使用usually使用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".(它显示"凯文·苏斯"的可能性很小,但只有通过记忆模型的怪异才行.)

然而,除非你有这样的问题,否则Control.BeginInvoke更容易得到正确的答案,并且可以避免你的后台线程无需等待任何好的理由.请注意,Windows窗体团队已保证,您可以以"开火并忘记"的方式使用Control.BeginInvoke,即不必拨打EndInvoke.一般来说,异步调用不是这样的:通常每个BeginXXX都应该有一个对应的EndXXX调用,通常在回调中.

.net相关问答推荐

将多行参数传递给Power Shell中的DotNet Pack命令

ASP.NET核心最小API必须以正斜杠开头吗?

.NET模拟具有泛型返回类型的方法

如何将 signalR 添加到不同项目中的后台服务?

如何在 .net MAUI 中删除不需要编译的平台?

.Include() 与 .Load() 在 EntityFramework 中的性能

JavaScript 中的IsNullOrWhitespace?

Environment.TickCount 与 DateTime.Now

.NET 应用程序的链接器状态(又名请先生,我可以有一个链接器2009 年版)

如何以编程方式判断类型是 struct 还是类?

什么是编组?当某些东西被编组时会发生什么?

如何将 UI Dispatcher 传递给 ViewModel

是否有 TLS 1.2 的 .NET 实现?

在 .NET 中查找下一个 TCP 端口

在 C# 中将匿名类型转换为键/值数组?

ILookup 接口与 IDictionary

如何将 WebResponse.GetResponseStream 返回转换为字符串?

为什么发布和调试模式下的代码行为不同?

如何使用通用扩展方法中的字符串列名在 IQueryable 上应用 OrderBy?

在 C# 中转义无效的 XML 字符