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

Posted s0611163

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>";
    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 异步缓存的主要内容,如果未能解决你的问题,请参考以下文章

异步编程之 async 和 await

用 async/await 来处理异步

用 async/await 来处理异步

Async/Await 同步方法中的异步和异步方法中的异步

第126篇: 异步函数(async和await)

NET 中的 async/await 异步编程