只是想知道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相关问答推荐

System.IO.Directory.Exists 在 LINQ 语句中失败,但在 foreach 循环中没有

作者主签名的时间戳发现了一个建链问题:UntrustedRoot: self-signed certificate in certificate chain

无法从 Microsoft.Extensions.Logging 解析 ILogger

我应该将 ILogger、ILogger、ILoggerFactory 或 ILoggerProvider 作为库吗?

System.ServiceModel 在 .NET Core 项目中找不到

更新 .NET Web 服务以使用 TLS 1.2

软件包版本始终为 1.0.0,带有 dotnet pack

找不到用于调试 .NET 源代码的 .cs 文件

我可以先使用 EF 代码和 .net 核心生成迁移脚本吗

具有不同身份验证标头的 HttpClient 单个实例

为什么 Visual Studio 2012 找不到我的测试?

从 Visual Studio 2015 发布 - 允许不受信任的证书

多行 C# 插值字符串文字

/langversion 的错误选项“6”无效;必须是 ISO-1、ISO-2、3、4、5 或默认值

将枚举转换为字符串

为什么我不能在 lambda 表达式中使用空传播运算符?

禁用 SSL 回退并仅将 TLS 用于 .NET 中的出站连接? (贵宾犬缓解)

3 个长整数的平均值

自创建数据库以来,支持“ApplicationDbContext”上下文的模型已更改

如何将 RestSharp 与 async/await 一起使用