异步.NET控制台程序中的线程控制流[重复]

2023-11-29

我在 C# 中摆弄 async/await 只是为了深入研究一些线程控制流,并偶然发现了一个不寻常的行为,我非常感谢对此的澄清。 即使任务本身在后台执行,await 之后的执行也会在调用线程上继续,这是有意义的。事实上,这正是 WPF 所发生的情况。
以下代码:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    Console.WriteLine($"Start. Thread: {Thread.CurrentThread.ManagedThreadId}");
    await Task.Run(async () => await Task.Delay(1000));
    Console.WriteLine($"End. Thread: {Thread.CurrentThread.ManagedThreadId}");
}

结果是:
开始。线程:1
结尾。线程:1

我意识到这是使程序流程可预测等的方法。

但令我惊讶的是,.NET 控制台应用程序的异步 Main 方法功能显示出一些不同的行为。
相同的代码:

static async Task Main(string[] args)
{
    Console.WriteLine($"Start. Thread: {Thread.CurrentThread.ManagedThreadId}");
    await Task.Run(async () => await Task.Delay(1000));
    Console.WriteLine($"End. Thread: {Thread.CurrentThread.ManagedThreadId}");
}

导致不同的线程控制流:
开始。线程:1
结尾。线程:5

我的猜测是,控制台应用程序具有不同的同步上下文概念,并且与 WPF 不同,它不绑定到主“UI”线程。但我实际上正在努力寻找一些与此相关的明确信息。


简而言之,当SynchronizationContext.Current没有设置,(控制台应用程序就是这种情况)。等待响应被调用ThreadPool.

在 Winforms/WPF 上,实现 SynchronizationContext 来对 winforms 的响应进行排队controlToSendTo.BeginInvoke();或 WPFDispatcher.BeginInvoke();.

参考:

  • Await、SynchronizationContext 和控制台应用程序(一篇博客文章由会员开发团队):

    但有一种常见的应用程序没有SynchronizationContext:控制台应用程序。当您的控制台应用程序的Main方法被调用,SynchronizationContext.Current将返回null。这意味着,如果您在控制台应用程序中调用异步方法,除非您做了一些特殊的事情,否则您的异步方法将不具有线程关联性:这些异步方法中的延续可能最终会在“任何地方”运行。

  • 并行计算 - 一切都与 SynchronizationContext 有关(一篇文章引用自的官方文档SynchronizationContext class):

    默认情况下,控制台应用程序和Windows服务中的所有线程都只有默认的SynchronizationContext.

    ...

    图4 总结SynchronizationContext实施
    ...

    
    ╔═════════╦═══════════╦════════════╦════════════╦══════════╦══════════╗
    ║         ║ Specific  ║ Exclusive  ║ Ordered    ║ Send May ║ Post May ║
    ║         ║ Thread    ║ (Delegates ║ (Delegates ║ Invoke   ║ Invoke   ║
    ║         ║ Used to   ║ Execute    ║ Execute    ║ Delegate ║ Delegate ║
    ║         ║ Execute   ║ One at     ║ in Queue   ║ Directly ║ Directly ║
    ║         ║ Delegates ║ a Time)    ║ Order)     ║          ║          ║
    ╠═════════╬═══════════╬════════════╬════════════╬══════════╬══════════╣
    ║ ...     ║           ║            ║            ║          ║          ║
    ╠═════════╬═══════════╬════════════╬════════════╬══════════╬══════════╣
    ║ Default ║ No        ║ No         ║ No         ║ Always   ║ Never    ║
    ╚═════════╩═══════════╩════════════╩════════════╩══════════╩══════════╝  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步.NET控制台程序中的线程控制流[重复] 的相关文章

  • CLR 内部字符串常量吗?

    最近我一直在阅读字符串实习生池的工作原理 然而我一直没能找到这个问题的答案 如果我声明一个常量字符串变量 例如const string STR foo 这是否也会添加到实习生表中 只是为了澄清事情 CLR 不参与字符串驻留 Internin
  • 资源文件中的控制字符 C#

    我想添加Left To Right控制字符在resource resx文件输入Visual Studio 我在互联网上搜索并找到了一个名为在 NET 资源文件中转义序列的另一种方法 http www devx com tips Tip 34
  • 如何防止函数中的隐式转换?

    我正在编写一个实用程序类 其中包含 IsEquals 和 IsGreaterThanEquals 等接受 double 类型参数的方法 当我将浮点值发送到方法时 它们会隐式转换为双精度值并进行比较 我不希望这种事发生 当我发送 float
  • 如何防止 Parallel.ForEach 循环在运行时更改任务数量?

    我正在使用Parallel ForEach循环做一些工作 我用localInit像这样 localInit gt new foo new Foo bars CreateBars 根据文档 https learn microsoft com
  • 委托 System.Action 不接受 1 个参数

    那个行动 readonly Action execute public RelayCommand Action execute this execute null public RelayCommand Action execute Fun
  • 使用 C 序列化 double 和 float

    如何在 C 中序列化双精度数和浮点数 我有以下用于序列化短整型 整数和字符的代码 unsigned char serialize char unsigned char buffer char value buffer 0 value ret
  • 带有成员 (operator[]) 函数的 invoke_result

    如何为成员函数正确调用invoke result 或者专门用于运算符成员函数 我试过std invoke result
  • 改装和授权标头

    目前 我正在向我的请求添加授权标头 如下所示 文件 SomeFile cs public interface ITestApi Get api test id Task
  • 对指针列表进行排序

    我再次发现自己在 C 中的一些非常简单的任务上失败了 有时我希望我能从 Java 中的 OO 中学到所有知识 因为我的问题通常是从像 Java 一样思考开始的 无论如何 我有一个std list
  • “双免”是什么意思?

    正如标题所暗示的那样 我是 C 语言的新手 并且很快就会有期中考试 我目前正在修改过去的论文 一个反复出现的主题是双重自由问题 我理解就是调用的过程free 在同一个内存位置两次 但我有几个问题我不能 100 确定如何回答 问题1 C中双重
  • ofstream::operator<<(streambuf) 是一种复制文件的缓慢方法

    我需要一种跨平台 无需外部库的复制文件的方式 在我的第一遍中 我想出了 省略错误处理 char buffer LEN ifstream src srcFile ios in ios binary ofstream dest destFile
  • “未定义对 clrscr() 的引用;” [复制]

    这个问题在这里已经有答案了 include
  • 使用 C# 在 XML 文档中查找特定值的好方法是什么?

    我正在调用 Oracle 公开的 WebService 它接受 ItemID 的输入并向我返回相应的 Item Number 我想获取从响应中包含的 XML 返回的项目编号 XML 看起来像这样
  • 设置了 OFN_ALLOWMULTISELECT 标志的 GetOpenFileName()

    我正在尝试使用 GetOpenFileName 通用对话框调用来弹出打开对话框并允许用户选择多个文件 我设置了 OFN ALLOWMULTISELECT 标志 并设置了 OFN EXPLORER 因此我得到了 新样式 文件选择框 当我设置
  • Pythonlibs3 CMake 和 macOS

    更新2 将以下两行添加到我的 CMake 文件中时 成功找到了 python 3 及其库 这只在终端中工作的原因是因为 CLion 使用其捆绑版本的 CMake 3 6 3 而我的终端使用的更新版本 3 7 2 正确找到了 python F
  • 成员函数的Decltype

    class A int f int x int j return 2 decltype f p 给我错误 error decltype cannot resolve address of overloaded function 我不明白为什
  • TPL架构问题

    我目前正在开展一个项目 我们面临并行处理项目的挑战 到目前为止没什么大不了的 现在来说说问题 我们有一个 ID 列表 我们定期 每 2 秒 为每个 ID 调用一个 StoredProcedure 需要单独检查每个项目的 2 秒 因为它们是在
  • SQlite 查询 - 如何检索多列数据?

    我很难在网上找到一个关于使用 xcode 和 cocos2dx 从 SQlite DB 获取多个值的工作示例 这是我的sql查询 char sql query 100 sprintf sql query SELECT FROM SQList
  • 找出用户属于哪些组

    我有一个刚刚创建的 Windows 用户帐户 以 XYZ 为例 此 XYZ 属于我在计算机管理 gt 本地用户和组中创建的用户组和自定义组 因此 在属性中我看到该用户属于 2 个组 现在我想获取这些组并显示它们 有什么建议么 我已经这样做了
  • Interlocked.CompareExchange 可以抛出 NullReferenceException 吗?

    From https msdn microsoft com en us library bb297966 v vs 110 aspx https msdn microsoft com en us library bb297966 v vs

随机推荐

  • VBscript - “系统找不到指定的文件”

    我正在尝试编写一个简短的 VBScript 它会打开 calc exe 和 wordpad exe 问题是 VBScript 不允许我打开 wordpad exe 我尝试以管理员身份运行该脚本 但这没有帮助 我的脚本如下所示 Set Wsh
  • 使用 jQuery 获取文件输入的选定文件名(不带路径)

    我用过这个 input type file val 获取选定的文件名 但它返回完整路径 如 C fakepath filename doc fakepath 部分实际上在那里 不确定它是否应该在那里 但这是我第一次使用文件上传的文件名 我怎
  • 在 JSfiddle 中添加图像 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我想创建一个小提琴 在其中我必须添加图像 作为 div 的背景图像 我尝试使用左侧的添加资源 但它不起作用 我还尝试在我的文件夹结构中提供图像的完整路径 但这也不起作用 有人知道该怎
  • 在Python中从矩阵中选择列向量

    我想在 Python numpy 中的矩阵中索引列向量 并将其作为列向量而不是一维数组返回 x np array 1 2 3 4 x 1 gt array 2 4 Giving np transpose x 1 不是一个解决方案 继nump
  • 在 R 中绘制多项式回归曲线

    我有一个简单的多项式回归 如下所示 attach mtcars fit lt lm mpg hp I hp 2 现在 我绘制如下 gt plot mpg hp gt points hp fitted fit col red pch 20 这
  • Flash & Flex SDK/AS3 - 如何保持键盘焦点?

    我正在 Flex AS3 中编写 Flash 应用程序 但我似乎无法为其分配键盘焦点 我在开发初期就注意到了这个问题 并添加了一个带有 立即播放 按钮的启动屏幕 以吸引用户点击 但是 用户必须在应用程序上再次单击才能使键盘正常工作 更糟糕的
  • 如何在 Qt 项目中包含库

    我正在尝试创建一个使用 TagLib 库的项目 我不太确定到底该怎么做 我已经下载了标签库 1 11 1 我构建它如下 构建 zlib 首先让 CMake 创建一个 Visual Studio 解决方案文件 然后使用 Visual Stud
  • 使用访问器将属性设置为新分配的对象会导致内存泄漏

    我只是想确认以下是否会导致内存泄漏 h file property nonatomic retain MyObject foo m file synthesize foo self foo MyObject alloc init deall
  • ArrayList .get 比 HashMap .get 快吗?

    我本来以为HashMap随机访问单个值的速度比ArrayLists 也就是说 HashMap get key 应该比ArrayList get index 仅仅因为ArrayList必须遍历集合的每个元素才能达到其值 而HashMap才不是
  • ject() 必须从注入上下文中调用

    我正在尝试将我的 Angular 应用程序导出为 npm 模块以供其他应用程序使用 但遇到了一些困难 我在互联网上的其他地方找不到这个错误 我已经无能为力了 我按照这个教程进行操作 https medium com nikolaslebla
  • 为什么 Azure Bot Service Slack 连接器不转发事件和交互式消息?

    更新 2020 年 6 月 30 日 经过更多测试后 我获得了一些详细信息 可以帮助其他人识别我的问题 问题似乎是 Slack 正在将数据发送到 Azure Bot 服务 但该数据没有转发到我的代码 我已经能够毫无问题地使用机器人模拟器 并
  • IP 地址“::1”是什么?

    我正在没有网络连接的本地计算机上使用套接字 见下文 IPAddress address IPAddress Any doesn t work IPAddress address IPAddress Parse 1 works 那么到底是什么
  • 根据购物车总金额的百分比支付押金

    我从另一篇文章中获取了这段代码 基本上根据我的理解 这段代码试图强制购物车价格更改为 40 美元的固定金额 并将其作为预订费收取 我想要做的是强制购物车金额为购物车中所有产品总和的 20 我的网站是为了预订 所以我只想收取押金然后让他们在使
  • Woocommerce 3 中的自定义结账字段和运输方式 ajax 交互

    这个问题很快就会让我去邮寄 在 Woocommerce Checkout 中 我需要在地址中添加自定义字段 这个额外的字段用于function calculate shipping package array 现在显然 woocommerc
  • IOS - 无法以编程方式打开 Whatsapp 聊天,但可以通过 HTML 来打开

    我有一个网页 其锚点包含 href whatsapp xxxxxxxxx 如果我在 iPhone iOS 9 上单击它 它会在该联系人的聊天视图中打开 WhatsApp 我可以看到所有我与联系人进行的聊天 但是 如果我以编程方式执行此操作
  • RewriteRule - html 损坏 - 就像缺少 css

    我对这个规则有疑问 RewriteRule d more php books 1 tags 2 L 执行此规则后 一切正常 但页面显示不正确 就像缺少CSS一样 提前致谢 当您有 CSS 文件的相对 URL 时 可能会发生这种情况 如果您访
  • C++ ifstream从linux到arduino

    原始代码 include
  • 如何在 txt 文件中写入,iOS 7

    我正在尝试为 iOS 7 制作一个 iPhone 应用程序 我在我的项目中创建了一个txt文件 并且希望能够从txt文件中写入文本 当我按下写入按钮时 写入并能够读取数据 当我按下读取按钮时 读 当我尝试读取数据时 我发现这种方法有效 IB
  • 尽管传递了参数列表,为什么将变量传递给 subprocess.Popen 不起作用?

    我有一个脚本调用另一个Python脚本subprocess Popen 但是因为我有参数存储在变量中 servers server address servers server port servers server pass 我无法执行该
  • 异步.NET控制台程序中的线程控制流[重复]

    这个问题在这里已经有答案了 我在 C 中摆弄 async await 只是为了深入研究一些线程控制流 并偶然发现了一个不寻常的行为 我非常感谢对此的澄清 即使任务本身在后台执行 await 之后的执行也会在调用线程上继续 这是有意义的 事实