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

    FTP异步下载代码:

ContractedBlock.gif ExpandedBlockStart.gif
/// /// 异步下载文件/// /// ftp路径/// 用户名/// 密码/// 文件相对路径public static async Task 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

    异步缓存代码:

ContractedBlock.gif ExpandedBlockStart.gif
/// /// 异步获取并缓存数据/// /// 键/// 在此方法中初始化数据/// 缓存过期时间(秒),0表示永不过期/// 立即刷新缓存public static async Task TryGetValueAsync(string cacheKey, Func> func, int expirationSeconds = 0, bool refreshCache = false){ string pre = "CacheHelper.TryGetValueAsync"; 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 异步下载接口:

ContractedBlock.gif ExpandedBlockStart.gif
/// /// 文件下载/// /// 文件存储相对路径[HttpGet][Route("DownloadFileByPath")]public async Task 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 异步缓存
文章转载:http://www.shaoqun.com/a/464246.html