我需要计算这两个独立的任务。之前我是串行进行的喜欢:字符串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();
}
}
}
我希望代码可以异步工作,但是可以同步工作
这可能是受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();