为什么Task <bool>比Task更快

Far*_*ukh -3 .net c# async-await .net-4.5

我有归档文件的功能,所以我尝试创建它的异步版本.但由于某种原因,如果我将函数的返回类型从Task更改为Task <bool>,它的工作速度会快得多.

以下是两个版本的实现.

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_);

            }
        });



    }
Run Code Online (Sandbox Code Playgroud)

我把它们称为

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!");

            }
Run Code Online (Sandbox Code Playgroud)

对于要压缩的相同文件,时间差别很大.

00:00:00.0049702 - 任务<bool>版本

00:00:08.4380303 - 任务版本

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

一个问题是在Task <bool>版本中我无法捕获异常.

Dim*_*tri 8

因为在第一个示例中,您实际上并未等待工作项,所以您在后台启动工作任务,但随后返回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;
        });

    }
Run Code Online (Sandbox Code Playgroud)