我有归档文件的功能,所以我尝试创建它的异步版本。 但出于某种原因,如果我将函数的返回类型从任务更改为任务< 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_);
}
});
}
我称之为
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 - 任务&lt; bool&gt;版本
00:00:08.4380303 - 任务版
有没有人遇到同样的问题?为什么这会产生如此大的差异?
一个问题是任务&lt; bool&gt; 版本我无法捕捉异常。
答案 0 :(得分: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;
});
}