async await 异步下载 异步代码加锁 lock 异步缓存

FTP异步下载代码:

/// <summary>
/// 异步下载文件
/// </summary>
/// <param name="ftpPath">ftp路径</param>
/// <param name="ftpUserId">用户名</param>
/// <param name="ftpPassword">密码</param>
/// <param name="relativeFilePath">文件相对路径</param>
public static async Task<MemoryStream> DownloadFileAsync(string ftpPath, string ftpUserId, string ftpPassword, string relativeFilePath)
{
FtpWebRequest request = null; try
{
LogTimeUtil log = new LogTimeUtil();
request = (FtpWebRequest)WebRequest.Create(new Uri(Path.Combine(ftpPath, relativeFilePath).Replace("\\", "/")));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = "RETR";
FtpWebResponse response = (FtpWebResponse)(await request.GetResponseAsync());
Stream responseStream = response.GetResponseStream();
MemoryStream stream = new MemoryStream();
byte[] bArr = new byte[1024 * 1024];
int size = await responseStream.ReadAsync(bArr, 0, (int)bArr.Length);
while (size > 0)
{
stream.Write(bArr, 0, size);
size = await responseStream.ReadAsync(bArr, 0, (int)bArr.Length);
}
stream.Seek(0, SeekOrigin.Begin);
responseStream.Close(); log.LogTime("FtpUtil.DownloadFileAsync 下载 filePath=" + relativeFilePath);
return stream;
}
catch (Exception ex)
{
request.Abort();
LogUtil.Error(ex);
} return null;
}

异步缓存代码:

/// <summary>
/// 异步获取并缓存数据
/// </summary>
/// <param name="cacheKey">键</param>
/// <param name="func">在此方法中初始化数据</param>
/// <param name="expirationSeconds">缓存过期时间(秒),0表示永不过期</param>
/// <param name="refreshCache">立即刷新缓存</param>
public static async Task<T> TryGetValueAsync<T>(string cacheKey, Func<Task<T>> func, int expirationSeconds = 0, bool refreshCache = false)
{
string pre = "CacheHelper.TryGetValueAsync<T>";
SemaphoreSlim sem = _dictSemaphoresForReadCache.GetOrAdd(pre + cacheKey, new SemaphoreSlim(1, 1));
await sem.WaitAsync(); try
{
object cacheValue = HttpRuntime.Cache.Get(cacheKey);
if (cacheValue != null)
{
return (T)cacheValue;
}
else
{
T value = await func();
if (expirationSeconds > 0)
{
HttpRuntime.Cache.Insert(cacheKey, value, null, DateTime.Now.AddSeconds(expirationSeconds), Cache.NoSlidingExpiration);
}
else
{
HttpRuntime.Cache.Insert(cacheKey, value);
}
return value;
}
}
catch (Exception ex)
{
LogUtil.Error(ex);
return default(T);
}
finally
{
sem.Release();
}
}

Web API 异步下载接口:

/// <summary>
/// 文件下载
/// </summary>
/// <param name="filePath">文件存储相对路径</param>
[HttpGet]
[Route("DownloadFileByPath")]
public async Task<HttpResponseMessage> DownloadFileByPath(string filePath)
{
HttpResponseMessage response = new HttpResponseMessage(); try
{
LogTimeUtil log = new LogTimeUtil();
string fileName = Path.GetFileName(filePath); if (FtpUtil.FileExists(_ftpPath, _ftpUserId, _ftpPassword, filePath))
{
byte[] bArr = await CacheHelper.TryGetValueAsync("DF9165DE189149258B34C405A2A7D7D1" + filePath, async () =>
{
MemoryStream ms = await FtpUtil.DownloadFileAsync(_ftpPath, _ftpUserId, _ftpPassword, filePath);
return ms.ToArray();
}, 180); response.Content = new ByteArrayContent(bArr);
response.Content.Headers.ContentLength = bArr.Length;
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileName;
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
}
else
{
LogUtil.Error("DownloadFileByPath 错误:文件不存在");
return new HttpResponseMessage(HttpStatusCode.NotFound);
}
log.LogTime("CommonController.DownloadFileByPath 下载 filePath=" + filePath);
}
catch (Exception ex)
{
LogUtil.Error(ex, "DownloadFileByPath 错误");
return new HttpResponseMessage(HttpStatusCode.NotFound);
} return response;
}

async await 异步下载 异步代码加锁 lock 异步缓存的更多相关文章

  1. [每日一题]面试官问:Async/Await 如何通过同步的方式实现异步?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  2. 已配置好的vue全家桶项目router,vuex,api,axios,vue-ls,async/await,less下载即使用

    github 地址: https://github.com/liangfengbo/vue-cli-project 点击进入 vue-cli-project 已构建配置好的vuejs全家桶项目,统一管 ...

  3. 温故知新,CSharp遇见异步编程(Async/Await),聊聊异步编程最佳做法

    什么是异步编程(Async/Await) Async/Await本质上是通过编译器实现的语法糖,它让我们能够轻松的写出简洁.易懂.易维护的异步代码. Async/Await是C# 5引入的关键字,用以 ...

  4. [C#] 走进异步编程的世界 - 开始接触 async/await

    走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $&qu ...

  5. 走进异步编程的世界 - 开始接触 async/await

    [C#] 走进异步编程的世界 - 开始接触 async/await   走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async ...

  6. [C#] 走进异步编程的世界 - 开始接触 async/await(转)

    原文链接:http://www.cnblogs.com/liqingwen/p/5831951.html 走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 ...

  7. .NET 基于任务的异步模式(Task-based Asynchronous Pattern,TAP) async await

    本文内容 概述 编写异步方法 异步程序中的控制流 API 异步方法 线程 异步和等待 返回类型和参数 参考资料 下载 Demo 下载 Demo TPL 与 APM 和 EAP 结合(APM 和 EAP ...

  8. 【C# TAP 异步编程】三、async\await的运作机理详解

    [原创] 本文只是个人笔记,很多错误,欢迎指出. 环境:vs2022  .net6.0 C#10 参考:https://blog.csdn.net/brook_shi/article/details/ ...

  9. How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式

    个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...

  10. C# 异步编程(async&await)

    同步:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去 异步:异步是指进程不需要一直等下去,而是继续执行下面的操作 ...

随机推荐

  1. C语言二进制转换成八,十,十六进制

    代码目前只支持整数转换,小数转换后续更新呀 #include <stdio.h> #include <math.h> void B_O(int n); void B_H(int ...

  2. 路径规划算法 - 求解最短路径 - A*(A-Star)算法

    Dijkstra(迪杰斯特拉)算法 A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法.算法中的距离估算值与实际值越接近,最终搜索速度越快. A* ...

  3. Http的演进

    Http的演进 Http在1.1版本之前具有无状态的特点,每次请求都需要通过TCP三次握手四次挥手与服务器重新建立连接.比如某个客户端在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户请求 ...

  4. C# 获取系统DPI缩放比例以及分辨率大小

    一般方法 System.Windows.Forms.Screen类 // 获取当前主屏幕分辨率 int screenWidth = Screen.PrimaryScreen.Bounds.Width; ...

  5. mybatis_高级

    注解方式: 不需要配置文件 @select等注解直接放在接口mapper里 多表操作: @Select("select * from user1") @Results({ @Res ...

  6. 后端程序员必会的前端知识-01:html、css

    第一章. HTML 与 CSS HTML 是什么:即 HyperText Markup language 超文本标记语言,咱们熟知的网页就是用它编写的,HTML 的作用是定义网页的内容和结构. Hyp ...

  7. Storm 集群的搭建及其Java编程进行简单统计计算

    一.Storm集群构建 编写storm 与 zookeeper的yml文件 storm yml文件的编写 具体如下: version: '2' services: zookeeper1: image: ...

  8. 微软官方发布的C#开源、免费、实用的Windows工具箱

    前言 今天分享一款由微软官方发布的C#开源.免费.实用的Windows工具箱(帮助用户调整和简化Windows系统的体验,从而提高工作效率):Microsoft PowerToys. 项目介绍 Mic ...

  9. IIS下使用SSL证书

    IIS下使用SSL证书 本文介绍windowsServer下SSL证书配置及IIS站点配置 1.    生成SSL证书 在阿里云申请免费SSL证书 登录阿里云管理控制台,打开SSL证书管理 选择免费证 ...

  10. 安装了华企盾DSC防泄密,所有进程的加密文件都无法打开

    用pchunter等工具查看系统回调中是否有文件厂商不存在的(system目录的除外),在恢复模式删除掉,或者用360系统急救箱查杀一下