C#的Task

news/2025/1/15 15:37:54/

优先使用Task.Run,除非有定制化需求才用Task.Factory.StartNew

Task.Factory.StartNew的TaskScheduler参数颠覆你的认知:

            var cnt = 0;var cancelToken = new CancellationTokenSource();await Task.Factory.StartNew(() => {cnt++;Debug.WriteLine($"Thread.CurrentThread.ManagedThreadId1={Thread.CurrentThread.ManagedThreadId}");}, cancelToken.Token, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()/*TaskScheduler.Default*/).ContinueWith((t) => {Debug.WriteLine($"Thread.CurrentThread.ManagedThreadId2={Thread.CurrentThread.ManagedThreadId}  {t.AsyncState}  {cnt}");}, /*TaskScheduler.Default*/TaskScheduler.FromCurrentSynchronizationContext());Debug.WriteLine("task finished");

Thread.CurrentThread.ManagedThreadId1=1
Thread.CurrentThread.ManagedThreadId2=1    1
task finished

如果给Task.Factory.StartNew函数传递TaskScheduler.FromCurrentSynchronizationContext()参数,则在主线程上执行;

TaskScheduler的三个全局静态成员:

Default:Task在线程池中执行

Current:使用启用任务的任务调度方式(如启动任务的任务调度在主线程执行,新的任务也在主线程执行)

FromCurrentSynchronizationContext():主线程中执行

注意:Task.Run和async、await两个关键字兼容,内部也是调用Task.Factory.StartNew实现的;可以看作是微软针对异步操作做了增强的版本。


http://www.ppmy.cn/news/1563028.html

相关文章

如何设计一个 RPC 框架?需要考虑哪些点?

面试官:如何设计一个 RPC 框架?需要考虑哪些点? 设计一个远程过程调用(RPC)框架是一个复杂的系统工程,涉及多个方面的考虑。一个好的 RPC 框架应具备可扩展性、灵活性、易用性和高性能。下面是设计 RPC 框…

平均(2023-省赛-贪心)

问题描述 有一个长度为 n 的数组(n 是 10 的倍数),每个数 ai 都是区间 [0,9] 中的整数。小明发现数组里每种数出现的次数不太平均,而更改第 i 个数的代价为 bi,他想更改若干个数的值使得这 10 种数出现的次数相等&…

Windows11下OpenCV最新版4.11源码编译

OpenCV最新版4.11源码编译 1. Opencv源码下载 Opencv Release下载网址 也可以在github里下载: https://github.com/opencv/opencv/releases 2. Cmake工具下载 Cmake 官网下载地址 3. 安装Cmake 4. 验证Cmake是否正常安装成功 5. 编译Opencv源码 5.1 配置opencv源码目录…

React中透过render函数学习(一)——workInProgress与双缓存机制

React 18 中 updateContainer 方法的简化实现,其中包含了一些重要的操作,如创建更新对象、将更新任务加入更新队列、调度更新等。这一过程体现了 React 内部如何协调渲染过程,尤其是如何在 Fiber 架构下处理更新。让我们逐步分析这个方法的工…

基于Python(Django)+SQLite3实现的(Web)资产管理系统

基于python和Django实现的资产管理系统 第一章 绪 论 1.1 研究工作的背景与意义 当今社会正快速向信息化社会前进。信息系统的作用也越来越大,特别是一些企业或组织等,往往需要管理大量的资产数据。对这些资产信息,往往需要安全的&#xf…

Linux标准IOday4

1:思维导图2: 创建2个子进程 父进程负责: 向文件中写入数据 2个子进程负责: 从文件中读取数据 要求: 一定保证1号子进程先读取&#xff0c;2号子进程后读取 使用文件IO去实现 #include <stdio.h>#include <string.h>#include <un…

【Docker】在 Ubuntu 上安装 Docker 的详细指南

目录 一、准备工作二、检查系统版本三、安装 Docker1. 安装必要的依赖2. 添加 Docker 的官方 GPG 密钥3. 添加 Docker 的 APT 源4. 更新 APT 包索引5. 安装 Docker CE6. 验证 Docker 是否安装成功 四、启动与测试 Docker1. 启动 Docker 服务2. 运行 Hello World 容器 五、设置 …

Elasticsearch:使用 Playground 与你的 PDF 聊天

LLMs作者&#xff1a;来自 Elastic Toms Mura 了解如何将 PDF 文件上传到 Kibana 并使用 Elastic Playground 与它们交互。本博客展示了在 Playground 中与 PDF 聊天的实用示例。 Elasticsearch 8.16 具有一项新功能&#xff0c;可让你将 PDF 文件直接上传到 Kibana 并使用 Pla…