• 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
  • 相关阅读:
    Nginx Record
    Go 查找元素
    博客转移公告
    模板库
    模板库
    【BZOJ2276】Temperature
    【BZOJ3524】Couriers
    【BZOJ4458】GTY的OJ
    AtCoder Grand Contest 007
    Editing 2011-2012 ACM-ICPC Northeastern European Regional Contest (NEERC 11)
  • 原文地址:https://www.cnblogs.com/s0611163/p/13489085.html
Copyright © 2020-2023  润新知