c# - 在 C# 中并行运行两个任务

标签 c# hash parallel-processing

我需要计算两个大文件(大约 10GB)的哈希值来检查是否相等。目前,我一次计算一个哈希值,但为了节省大量时间,我想到了同时并行计算两个哈希值。 这是我的方法:

private bool checkEquality(FileInfo firstFile, FileInfo secondFile)
{
    //These 2 lines are for creating one hash at a time, currently commented out for 
    //testing purpose
    //byte[] firstHash = createHash(firstFile);
    //byte[] secondHash = createHash(secondFile);

    //My take in running the computing processes parallely
    Task<byte[]> fh = Task.Run(() => createHash(firstFile));
    Task<byte[]> sh = Task.Run(() => createHash(secondFile));

    byte[] firstHash = fh.Result;
    byte[] secondHash = sh.Result;

    for (int i = 0; i < firstHash.Length; i++)
    {
        if (firstHash[i] != secondHash[i]) return false;
    }           
    return true;        
}

由于这是我第一次尝试做这样的事情,所以我不太确定我编写的代码是否按照我的想象工作,因为我已经看到通常将异步方法与await关键字结合使用其他线程,但我还无法理解这个概念。

编辑: 好的,我将方法更改为:

private async Task<bool> checkEquality(FileInfo firstFile, FileInfo secondFile)
{
    //These 2 lines are for creating one hash at a time, currently commented out for 
    //testing purpose
    //byte[] firstHash = createHash(firstFile);
    //byte[] secondHash = createHash(secondFile);

    //My take in running the computing processes parallely
    Task<byte[]> fh = Task.Run(() => createHash(firstFile));
    Task<byte[]> sh = Task.Run(() => createHash(secondFile));

    byte[] firstHash = await fh;
    byte[] secondHash = await sh;

    for (int i = 0; i < firstHash.Length; i++)
    {
        if (firstHash[i] != secondHash[i]) return false;
    }           
    return true;        
}

这是同时异步运行两个计算进程的工作方式吗?

最佳答案

您可以使用 Task.WhenAll 运行这两个任务并等待它们完成。

var result = await Task.WhenAll(fh, sh);
byte[] firstHash = result[0];
byte[] secondHash = result[1];

关于c# - 在 C# 中并行运行两个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75258349/

相关文章:

java - 在 Java 中保护用户密码安全?

c - 在使用 exec 运行另一组进程之前等待并行进程

c# - LINQ - 如果我有很多更改,我应该以某种方式定期 SubmitChanges() 吗?

java - Selenium WebDriver : For editing and deleting elements in a list, 我应该始终选择第一个元素的原因是什么,反之亦然

c# - 将十六进制字符串转换为图像

c# - RavenDB 附件

algorithm - OpenMP 稀疏雅可比

c# - 重复拳击做出不同的引用?

hash - 截断 sha-160 哈希值是否会产生合理的哈希值?

perl - 如何在 Perl 中表示集合?