首页 > 编程语言 >在C#中能用异步来包装同步调用吗?

在C#中能用异步来包装同步调用吗?

时间:2023-10-31 11:12:05浏览次数:42  
标签:异步 Task C# millisecondsTimeout 包装 线程 中能 Sleep

我应该为同步方法公开异步包装器吗?

对于这样的问题,我的简短回答是“不”。

例如,考虑一个同步方法Sleep,它在N毫秒内不返回:

public void Sleep(int millisecondsTimeout)
{
    Thread.Sleep(millisecondsTimeout);
}

现在,考虑创建异步版本的需求,这样返回的Task在N毫秒内不会完成。这里有一个可能的实现,简单地用Task包装Sleep。运行命令创建一个SleepAsync:

public Task SleepAsync(int millisecondsTimeout)
{
    return Task.Run(() => Sleep(millisecondsTimeout));
}

这是另一个不使用Sleep的,而是重写实现以消耗更少的资源:

public Task SleepAsync(int millisecondsTimeout)
{
    TaskCompletionSource<bool> tcs = null;
    var t = new Timer(delegate { tcs.TrySetResult(true); }, null, –1, -1);
    tcs = new TaskCompletionSource<bool>(t);
    t.Change(millisecondsTimeout, -1);
    return tcs.Task;
}

这两种实现都提供相同的基本行为,都在超时过期后完成返回的任务。然而,从可伸缩性的角度来看,后者更具可伸缩性。前一种实现在等待时间期间从线程池中消耗一个线程,而后一种实现仅依赖于一个有效的计时器,在等待时间到期时向Task发出信号。

场景

1.在服务器开发中,不要用异步方法包装同步方法,因为这只是转移了执行任务的线程,并不能带来实际性的性能提升,而且线程调度还会带来一定的开销

2.在桌面开发中,使用异步方法包装同步方法是可行的,因为某些操作会长期执行而阻塞UI。使用异步将UI线程转移到线程池执行,这点开销是值得的。

3.在桌面开发中,使用异步方法包装同步方法对并行性也很重要。 并行编程就是把一个问题分割成可以并发处理的子问题。 如果你将一个问题分割成子问题,然后串行地处理每个子问题,就没有任务并行可言,因为是在一个线程上处理。 相反,如果你通过异步调用将一个子问题转移到另一个线程,你就可以并发地处理这些子问题。 这样就可以通过包装来实现并行性。

4.平常我们在封装接口时,如果一个方法没有异步实现,就不要再去增加一个Task.Run包装的异步实现。因为这对调用者来说,并不友好。是否需要包装成异步,应该由调用者决定,我们直接给出同步实现的接口即可。

5. 好的异步,是可以充分利用服务器硬件资源,而不是换个方式阻塞

参考:https://devblogs.microsoft.com/pfxteam/should-i-expose-asynchronous-wrappers-for-synchronous-methods/

标签:异步,Task,C#,millisecondsTimeout,包装,线程,中能,Sleep
From: https://www.cnblogs.com/kkbk/p/17799799.html

相关文章

  • 【面试题】详解JavaScript中的Map()
    JavaScript中的Map()JavaScript是一种动态、解释性的编程语言,用于开发web上的动态页面和交互式应用程序。与其他编程语言相比,JavaScript拥有更加灵活的内置数据类型,并且拥有更高级别的调试和错误处理工具。JavaScript的核心特征之一就是其内置的Map()数据结构,本文将详细介绍JavaScr......
  • 2023年第四季度DAMA-CDGA/CDGP数据治理认证报名开始啦!
    DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业竞争能力。DAMA是数据管理方面的认证,帮助数据从业者提升......
  • React Native 页面调试工具 react-native-vdebug
    yarnaddreact-native-vdebugimportReactfrom'react'import{createNativeStackNavigator}from'@react-navigation/native-stack'import{getRouter}from'./config'import{ErrorBoundary}from'../component/light......
  • 2023第四季北京/上海/广州/深圳DAMA-CDGA/CDGP数据治理认证报名
    DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业竞争能力。DAMA是数据管理方面的认证,帮助数据从业者提升......
  • React Native expo项目设置app顶部的状态栏
       importReactfrom'react'import{createNativeStackNavigator}from'@react-navigation/native-stack'import{getRouter}from'./config'import{ErrorBoundary}from'../component/light'importVDebug,{initT......
  • 2023第四期CDGA和CDGP认证考试定于2023年12月17日举行
    2023年度第四期CDGA和CDGP认证考试定于2023年12月17日举行。考试报名现已开启,相关事宜通知如下: —— 考试科目及时间 ——CDGA数据治理工程师:2023年12月17日(周日)14:00-15:40CDGP数据治理专家:2023年12月17日(周日)14:00-16:10——考试地点 —— 北京、上海、广州、深圳、......
  • DC电源模块在工业自动化中的应用
    BOSHIDADC电源模块在工业自动化中的应用随着工业自动化的快速发展,电子技术的不断进步,DC电源模块已经成为了工业自动化领域中的重要组成部分之一。DC电源模块广泛应用于各种自动化设备中,如PLC、DCS、机器人、变频器等。本文将从以下几个方面详细介绍DC电源模块在工业自动化中的应用......
  • DC电源模块同类型号能否代替
    BOSHIDADC电源模块同类型号能否代替DC电源模块是我们在电路设计中经常使用的一种电源供应装置。一些项目需要特定的电压和电流,所以选择正确的电源是非常重要的。当我们开始设计一个电路时,我们需要考虑电源的性能、稳定性、可靠性、价格和供应周期等方面。有时候,我们可能需要在不同......
  • DC电源模块关于高效率的特点
    DC电源模块关于高效率的特点DC电源模块是目前应用广泛的电源系统之一,它的高效率是其最为显著地特点之一。本文将从以下三个方面进行介绍:什么是DC电源模块、DC电源模块的工作原理以及DC电源模块的高效率特点。 一、什么是DC电源模块DC电源模块是一种对电源进行电压、电流稳定化处理......
  • 一文详解 springboot 项目启动时异步执行初始化逻辑
    你知道的越多,你不知道的越多点赞再看,养成习惯文章目录前言代码实现定义异步处理工具类实现java线程池新建AppInit实现ApplicationRunner接口完成启动项目时异步数据初始化前言前面的工作中,为了提高地区数据的响应时间,需要加载全国区划数据到redis中缓存起来,这个过程希......