async void 方法每次调用时都会创建一个新线程吗?

2023-12-23

我有以下场景:

async void DoStuff() {
    // ...
}

button1.Click += (s, p) => {
    DoStuff();
};

我不确定当我打电话时会发生什么async void方法,而第一次调用仍然不完整。 该调用是否会在每次调用时创建一个新线程,还是会销毁并覆盖先前创建的线程?另外,如果前一个假设正确,局部方法变量是否会被共享?

EDITED:

我误解了async await因为在 Windows 8 应用程序中,它的行为有所不同。如果您像我一样认为调用异步方法与创建新线程相同,请阅读这篇澄清文章 http://blogs.infosupport.com/c-5-0-async-explained-as-simple-as-possible/.


我不确定当我同时多次调用 async void 方法时会发生什么

您的意思是,如果在第一个调用尚未完成(可能“暂停”)时发生另一个调用?它会工作得很好。没有“超越”,没有“破坏”。您最终将得到状态机的另一个实例(这是编译器为您构建的)。

两个状态机将具有完全独立的局部变量等。当然,实际上只有其中之一可以run一次,除非在异步方法中的某个地方,否则您会避免捕获上下文。

不要忘记启动一个异步方法doesn't开始一个新线程。您启动的一些异步操作within异步方法可能会启动新线程,但这是另一回事。生成的代码中没有任何内容创建新线程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

async void 方法每次调用时都会创建一个新线程吗? 的相关文章

随机推荐

  • 如何使用 gitlab-ci 中的托管标识进行身份验证,将 docker 容器从 gitlab 注册表推送到 Azure Web 服务?

    我研究了将 docker 镜像从 gitlab 容器注册表推送到 azure 资源的方法 将 Docker 映像从 gitlab ci 推送到 Azure 容器注册表 https stackoverflow com questions 49
  • 如何将 git 提交消息保存到文件中?

    想要提交 修复错误并将更改发送到 GIT 存储库 但消息数超出了 Unix 命令行中显示的行数 因此我无法读取错误消息 如何将 GIT 提交消息保存到文件或可能增加 Unix 命令行上显示的行数 似乎在这个 GIT 构建中使用了钩子 它显示
  • 如何从Android中的CalendarView中选择日期范围?

    我需要从 android 的 CalenderView 中选择多次日期 任何人都可以帮助我做同样的事情吗 例子 让我们看看附图 如果我们将图像中的日历视为 android 的日历视图 我需要选择从 16 日到 20 日的所有日期 据我所知C
  • Yii2,抛出NotFoundException时发生错误

    我有一个在应用程序的 beforeAction 事件上运行的简单代码 on beforeAction gt function event throw new yii web NotFoundHttpException The request
  • 如何通过索引将项目添加到 Laravel Eloquent Collection 中?

    我尝试了以下方法 但它不起作用 index 2 collection gt put index item4 例如 如果 collection 看起来像这样 collection item1 item2 item3 我想结束 collecti
  • Gradle 在 bin 目录中创建重复的启动脚本

    我正在尝试通过 gradle 创建多个启动脚本文件 但不知何故 一个特定的启动脚本文件正在重复 startScripts enabled false run enabled false def createScript project ma
  • Java 泛型放在 Map>

    有没有办法以类型安全的方式进行以下实现 public void myMethod Map
  • 如何比较 Svelte 3 中的 Prop 变化

    Svelte 3 中是否有一种机制可以在渲染之前比较组件内的 prop 更改 类似于 反应从Props获取DerivedState https reactjs org docs react component html static get
  • 车把模板中 href 标签中的 Ember 插值

    我正在尝试建立一个到谷歌地图的简单链接 并将动态地址插入到 href 字段中 我已经尝试过下面的代码以及大量其他乱七八糟的东西 但没有运气 如何在车把 href 字段中插入动态 ember 字符串 我正在使用 ember 导轨和车把 如果我
  • 将二进制路径添加到 emacs $PATH

    我尝试了以下方法 setenv PATH concat getenv PATH mybin setq exec path append exec path mybin 但这从来没有奏效 我试过M 并键入二进制名称之一 并且在使用二进制名称进
  • Select2:init后如何设置数据?

    我需要在初始化 select2 后设置一个数据数组 所以我想做这样的事情 var select select select2 select data id 1 text value1 id 1 text value1 但我收到以下错误 当附
  • 连接字符串和实体框架的问题

    我有一个数据库 sql 2008 mdf 文件 一个带有 edmx 文件的类库项目 是使用向导创建的 所以连接字符串也是由向导制作的 该项目位于 teamfoundation 服务器上 我可以在编码时使用所有向导创建的对象 但是当我运行程序
  • DisplayFormat 未应用于十进制值

    我有一个模型属性 我正在尝试使用 EditorFor 模板进行渲染 并且我正在尝试使用 DisplayFormat 属性应用格式 然而 它根本不起作用 它完全被忽略了 这是我的模板 model System Decimal Html Tex
  • IoC:如何动态创建对象

    我无法理解如何在需要动态创建对象的场景中使用 IoC 假设我有这样的课程 abstract class Field public Field ICommandStack commandStack abstract class Entity
  • 使用 python 的树莓派旋转编码器脚本

    我有一个设置 其中有一个电机以每秒约 1 转的速度转动直径 5 厘米的轴 我需要在预定的转数后停止电机 现在假设是 10 转 我使用的传感器机制只是一个磁铁和簧片开关 以下脚本可以很好地记录每次触发开关的情况 import RPi GPIO
  • Android SQLite 数据库损坏

    这个链接准确地描述了我的问题 http old nabble com Android database corruption td28044218 html a28044218 http old nabble com Android dat
  • 如何在postgresql中使用设置种子选择可重复的随机数?

    我想要实现的是为流程选择一个控制组 为此 我使用 random 为了调试 一致性 我希望能够以可重复的方式设置随机数 意思是 一旦它为用户 123 分配随机数 0 001 我就运行查询 在不同的时间 我删除以前的数据 调用相同的查询 并再次
  • 如何从应用程序设置 Azure (webapp) 接收数据到我的 webjob

    我用 C 创建了一个 Azure WebJob 我在 Azure 上有一个 Web 应用程序 我将 WebJob 添加到了我的订阅中 一切都很好 但在应用程序设置中我添加了一个新条目 例如
  • C 比较两个位图的最快方法

    有两个字符数组形式的位图数组 有数百万条记录 使用 C 来比较它们的最快方法是什么 我可以想象在 for 循环中一次使用按位运算符异或 1 个字节 关于位图的重要一点 算法运行的 1 到 10 次中 位图可能会有所不同 大多数时候它们都是一
  • async void 方法每次调用时都会创建一个新线程吗?

    我有以下场景 async void DoStuff button1 Click s p gt DoStuff 我不确定当我打电话时会发生什么async void方法 而第一次调用仍然不完整 该调用是否会在每次调用时创建一个新线程 还是会销毁