2020年8月12日星期三

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

    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;}
View Code

    异步缓存代码:

/// <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>"; Semaphore sem = _dictSemaphoresForReadCache.GetOrAdd(pre + cacheKey, new Semaphore(1, 1)); sem.WaitOne(); 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(); }}
View Code

    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;}
View Code

 

async await 异步下载 异步代码加锁 lock 异步缓存卖家精灵一淘网cima印尼电商巨头Tokopedia推出穆斯林电商频道重磅!每月23日Shopee平台将定期清理不活跃卖家账号,深圳圆通仓库已停止使用.....亚马逊收费巨坑:仅仅填了一个词,佣金从15%变45%!小年是哪天?小年夜是什么时候?德庆盘龙峡彩虹花田有什么好玩的?鳄鱼公园内有餐馆吗?

没有评论:

发表评论