异步返回多个值

问题描述 投票:0回答:1

我需要计算这两个独立的任务。之前我是串行进行的喜欢:字符串firstHash = CalculateMD5Hash(“ MyName”);字符串secondHash = CalculateMD5Hash(“ NoName”);

and the method calculateMD5Hash looks like:
private string CalculateMD5(string filename)
{
    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(filename))
        {
            var hash = md5.ComputeHash(stream);
            return BitConverter.ToString(hash).Replace("-", string.Empty).ToLowerInvariant();
        }
    }
}

But,Since these 2 CalculateMD5Hash methods can run parallely,I was trying this:
Task<string> sequenceFileMd5Task = CalculateMD5("MyName");
Task<string> targetFileMD5task=CalculateMD5("NoName");
string firstHash=await sequenceFileMd5Task;
string secondHash=await targetFileMD5task;

And my CalculateMD5 method looks like:
private async Task<string> CalculateMD5(string filename)
{
    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(filename))
        {
            var hash = md5.ComputeHash(stream);
            return BitConverter.ToString(hash).Replace("-", string.Empty).ToLowerInvariant();
        }
    }
}

我希望代码可以异步工作,但是可以同步工作

c# async-await task-parallel-library
1个回答
0
投票

这可能是受I / O限制的,所以并行化它可能不会使事情加速很多(甚至可能使事情减速)。

已经说过,您的代码存在的问题是您没有创建任何新任务来在后台运行代码(仅指定async不会创建任何线程)。

而不是试图“强制”使用异步,最简单的解决方案可能是通过AsParallel利用PLinq:

List<string> files = new List<string>()
{
    "MyName",
    "NoName"
};

var results = files.AsParallel().Select(CalculateMD5).ToList();

如果要限制用于此目的的线程数,可以按照以下示例使用WithDegreeOfParallelism(),它将并行线程数限制为2:

var results = files.AsParallel().WithDegreeOfParallelism(2).Select(CalculateMD5).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.