码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-08-12 15:53:18      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:key   release   finally   时间   show   wait   func   else   display   

    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 异步缓存

标签:key   release   finally   时间   show   wait   func   else   display   

原文地址:https://www.cnblogs.com/s0611163/p/13489085.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!