为什么 Task 比 Task 更快

本文关键字:Task 更快 bool 为什么 | 更新日期: 2023-09-27 18:34:15

我有存档文件的功能,所以我尝试创建它的异步版本。但是出于某种原因,如果我将函数的返回类型从 Task 更改为 Task 它的工作速度要快得多。

下面是实现的两个版本。

public Task<bool> PsiZipFilesAsync(string zipFileName_, string[] listOfFiles_)
    {
        Task.Run(() => 
        {
            using (ZipArchive zip = new ZipArchive())
            {
                //zip.Password = pass;
                zip.EncryptionType = EncryptionType.PkZip;
                zip.AddFiles(listOfFiles_);
                zip.Save(zipFileName_);
            }
        });
        return Task.FromResult(true);
    }
    public Task PsiZipFilesAsync2(string zipFileName_, string[] listOfFiles_)
    {
        return Task.Run(() =>
        {
            using (ZipArchive zip = new ZipArchive())
            {
                //zip.Password = pass;
                zip.EncryptionType = EncryptionType.PkZip;
                zip.AddFiles(listOfFiles_);
                zip.Save(zipFileName_);
            }
        });

    }

我称他们为

try
            {
                await zip.PsiZipFilesAsync("async_archive.zip", ofd.FileNames);
                //await zip.PsiZipFilesAsync2("async_archive.zip", ofd.FileNames);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Exception!");
            }

压缩相同文件的时间差异很大。

00:00

:00.0049702 - 任务<布尔>版本

00:

00:08.4380303 - 任务版本

有人遇到同样的问题吗?为什么会产生如此大的差异?

一个问题是,在任务<布尔>版本中,我无法捕获异常。

为什么 Task<bool> 比 Task 更快

因为在第一个示例中,您实际上并没有等待工作项,而是在后台启动工作任务,但随后返回 Task.FromResult(true) 并等待将任务结果设置为 true 并立即返回,而在第二个示例中,您实际上是在执行工作并等待完成。

将第一个示例更改为如下所示,然后重试:

public Task<bool> PsiZipFilesAsync(string zipFileName_, string[] listOfFiles_)
    {
        return Task.Run(() => 
        {
            using (ZipArchive zip = new ZipArchive())
            {
                //zip.Password = pass;
                zip.EncryptionType = EncryptionType.PkZip;
                zip.AddFiles(listOfFiles_);
                zip.Save(zipFileName_);
            }
            return true;
        });
    }