zoukankan      html  css  js  c++  java
  • 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>";
        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();
        }
    }
    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
  • 相关阅读:
    [非技术]简单预测中美关系未来的走向
    权限系统模型和常用权限框架
    [Tomcat]了解Tomcat,从它的结构开始
    [Mybatis]用AOP和mybatis来实现一下mysql读写分离
    [MQ]说一说MQ消息积压
    [MQ]再谈延时队列
    [Web] 浅谈Cookie,Session,Token
    k8s搭建
    微信公众平台开发(2)扫描二维码添加公众账号
    微信公众平台开发模式
  • 原文地址:https://www.cnblogs.com/s0611163/p/13489085.html
Copyright © 2011-2022 走看看