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
  • 相关阅读:
    js全选 反选 不选 代码示例。
    前端超级好用a标签跳转带锚点效果
    10分钟倒计时简易
    点赞投票+1简单jq代码
    登录注册密码可见与不可见jquery简易效果开发
    JS调用函数内部变量有以下两种方法:
    关于clipboard.js复制图片以及文本的随笔
    这是我的第一个博客,我叫小白菜!
    前端之路(一)之W3C是什么?
    知识普及
  • 原文地址:https://www.cnblogs.com/s0611163/p/13489085.html
Copyright © 2011-2022 走看看