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

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

    FTP异步下载代码:

/// 
/// 异步下载文件
/// 
/// ftp路径
/// 用户名
/// 密码
/// 文件相对路径
public static async Task 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

    异步缓存代码:

/// 
/// 异步获取并缓存数据
/// 
/// 
/// 在此方法中初始化数据
/// 缓存过期时间(秒),0表示永不过期
/// 立即刷新缓存
public static async Task TryGetValueAsync(string cacheKey, Func> func, int expirationSeconds = 0, bool refreshCache = false)
{
    string pre = "CacheHelper.TryGetValueAsync";
    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 异步下载接口:

/// 
/// 文件下载
/// 
/// 文件存储相对路径
[HttpGet]
[Route("DownloadFileByPath")]
public async Task 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 异步缓存)