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

  • A+
所属分类:.NET技术
摘要

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

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

    FTP异步下载代码:

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

/// <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

    异步缓存代码:

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

/// <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 异步下载接口:

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

/// <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