新线程的异步等待行为

2023-11-30

我试图理解 async/await 的精确行为,但在理解它时遇到了一些麻烦。

考虑这个例子:

public async void StartThread()
{
    while(true){
        SomeOtherClass.SomeSynchronousStuff();
        var something = await SomeOtherClass.SomeOtherAsyncMethod();
    }
}

public void ConstructorForThisClass()
{
    Thread thread = new Thread(StartThread);
    thread.Start();
}

我对 async/await 的理解是,编译器本质上是将代码转换为一堆回调并为每个回调存储状态对象。

所以根据这个,我的问题是:

  1. 新创建的线程会异步运行吗?意思是,当线程正在等待SomeOtherAsyncMethod,会被腾出来从事其他工作吗?
  2. 如果上述情况为真,则线程是否会直接结束,并在以下情况下由线程池线程取代它:SomeOtherAsyncMethod回报?
  3. 我将如何发行StartThread在线程池线程而不是托管线程上运行?
  4. 当可等待方法返回到其调用者时,它是否会强制在调用它的线程上恢复,或者是否可以由任何空闲线程代替它?

裸线程不能很好地工作async/await.

新创建的线程会异步运行吗?这意味着,当线程等待 SomeOtherAsyncMethod 时,它是否会被释放以从事其他工作?

实际上,线程将会退出。什么时候StartThread后恢复await,它将在线程池线程上执行。

我将如何在线程池线程而不是托管线程上发出 StartThread 函数?

首先,您想要更改的返回类型StartThread from void to Task. async void方法用于事件处理程序;在其他地方使用它们可能会导致各种问题。

然后你可以通过调用它Task.Run:

var backgroundTask = Task.Run(() => StartThread());

当可等待方法返回到其调用者时,它是否会强制在调用它的线程上恢复,或者是否可以由任何空闲线程代替它?

默认情况下,await操作员将捕获“当前上下文”并恢复在此背景下。这个“当前上下文”是SynchronizationContext.Current,除非是null,在这种情况下是TaskScheduler.Current。通常,这是 UI/ASP.NETSynchronizationContext,否则它是线程池上下文(TaskScheduler.Default).

你可能会发现我的async intro有帮助。

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

新线程的异步等待行为 的相关文章

  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 为什么下面代码的输出是Thread[main,5,main]

    public class test1 public static void main String args TODO Auto generated method stub Thread t Thread currentThread Sys
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • Selenium WebDriver 将 Firefox 路径更改为 Tor

    我正在尝试更改 ruby 中的网络驱动程序以打开 Tor 浏览器而不是默认的 Firefox 浏览器 我正在使用以下代码 并且在运行此代码之前打开了 Tor 浏览器 path C Users Bonnnie Downloads Tor Br
  • 是否可以使用 Omnifaces #{of:setToList} 创建可编辑数据表

    我正在尝试创建一个可编辑的数据表 其值为java util Set 但在 JSF 2 0 和 2 1 中这是不可能的 如中所述在 Datatable JSF 中显示 Set 集合中的对象不起作用 到目前为止 作为解决方案 所有集都转换为ja
  • 我的 UIButton 的位置在所有模拟器中都不同

    我在一个项目下 我使用代码 不是通过故事板 在视图控制器的底部创建了一个 uibutton 但是当我运行我的应用程序时 我的 uibutton 放置在不同的位置 例如在 iphone 5 6 模拟器中某个位置 在 4s 中 ipad 模拟器
  • AngularJS 错误:指令“XXXXXX”的模板必须只有一个根元素

    这是后续这个问题 我正在尝试构建和 HTML table 与多个 tr 行 我希望其中一些行由我的指令呈现myDirectiveA以及其他由我的指令 myDirectiveB 呈现的内容 您可以在下面看到我的文件的样子 如果只有一个 一切正
  • Android,如何创建选项菜单

    在这里 我尝试制作选项菜单 但菜单没有显示在屏幕上 所以请指导我哪里做错了 菜单测试 java public class MenuTest extends Activity Override public boolean onCreateO
  • 给定当前日期和周开始,获取周开始和结束日期

    如果可能的话 我更喜欢针对以下场景的 joda 或非 joda 解决方案 假设我的一周从 02 05 2012 开始 并且给定的当前日期是 02 22 2011 我需要计算给定当前日期的周开始日期和结束日期 所以我的解决方案应该让一周从 0
  • ASP.Net 按钮单击事件未触发

    这或许与这个问题 但我有更多的信息 最近 在使用 Linq 编写了一些新代码后 我将 ASP Net 应用程序更新到了 NET 3 5 现在我的页面间歇性地停止触发事件处理程序 我将范围缩小到带有 Ajax 的页面 并且我认为是 Scrip
  • C 编译错误:“可变大小的对象可能未初始化”

    为什么我使用以下代码收到错误 可变大小的对象可能未初始化 int boardAux length length 0 我假设您正在使用 C99 编译器 带有支持动态大小的数组 您的代码中的问题是 当编译器看到您的变量声明时 它无法知道数组中有
  • ASP.Net Identity 注销所有会话

    如何使用 ASP NET Identity 注销所有会话 假设您使用同一用户从两个不同的浏览器登录 当用户从一个浏览器注销时 另一个浏览器的会话也应该失效 我需要这个来使用户在更改密码时的所有会话无效 您可以使用以下代码使用 ASP Net
  • 在 Nexus 中部署工件时出错

    我在 Nexus 服务器中部署自己的存储库中的工件时遇到错误 无法部署工件 无法传输工件 无法传输文件 http my artifact 返回代码为 400 我让 Nexus 与一个自定义存储库 my repo 一起运行 并使用下一个 Ma
  • 在作业中进行大量选择后,Spring 批处理内存不足

    我的工作遇到了问题 我正在尝试从数据库读取记录并写入txt 文件 数据库包含 1 800 000 条记录 有 149 列 问题是 select 位于 jobConfig xml 中的 bean mysqlItemReader 中 但是 我认
  • spring MVC POST 表单的大小限制?

    我有一个表格
  • 将存储库公开为 IQueryable

    我想将存储库公开为 IQueryable 类型 该存储库使用 Linq to NHibernate 与数据库进行通信 谁能指出我的示例实现吗 例如 我的存储库上相应的 GetEnumerator 实现是什么样子 Edit 这样的事情合适吗
  • 使用passport.js在node.js中进行身份验证后重定向到上一页

    我正在尝试使用node js express 和passport js 建立登录机制 登录本身工作得很好 会话也用 redis 很好地存储 但在提示用户进行身份验证之前将用户重定向到他开始的位置时确实遇到了一些麻烦 例如用户点击链接http
  • NumberField 或如何让 TextField 输入 Double、Float 或其他带点的数字

    根据评论这个问题我做了一个自定义的 SwiftUIView基于一个TextField 它使用数字键盘 只能输入数字和点 只能输入一个点 点 并且可以通过Bindable Double State价值通过View用于输入 但有一个错误 当您删
  • iOS 上的 CVOpenGLESTextureCache 与 glTexSubImage2D

    我的 OpenGL 应用程序使用 OpenGL 全屏渲染纹理并定期更新其中的一部分 到目前为止 我一直在使用 glTexImage2D 来推送初始纹理 然后使用 glTexSubImage2D 更新脏区域 为此 我使用单缓冲 这效果很好 我
  • 大数的质因数分解[关闭]

    Closed 这个问题是无关 目前不接受答案 我想求小于10 12的大数的质因数分解 我得到了这个代码 用java public static List
  • 类工厂方法实现

    因此 我正在研究 Objective C 的 Apple 文档 在开始 iphone 开发之前 其中一项练习指出 我应该创建一个指定的初始值设定项 具有 3 个参数 和合适的工厂方法 现在我根据我的理解这样做了 但我无法实现工厂方法 因为我
  • 以编程方式清除 Android 上 PhoneGap/Cordova 应用程序的缓存以模拟全新安装?

    这与我之前的问题有关 每次安装应用程序时 如何清除 Android 模拟器上应用程序的 localStorage 它还建立在 如何清除 Android 应用程序缓存 and 如何以编程方式清除应用程序数据 上述问题都没有给出适用于 Andr
  • 新线程的异步等待行为

    我试图理解 async await 的精确行为 但在理解它时遇到了一些麻烦 考虑这个例子 public async void StartThread while true SomeOtherClass SomeSynchronousStuf