【发布时间】:2013-12-05 02:15:19
【问题描述】:
在一个 winforms 应用程序中,我有一个下载文件解压缩 ZIP 文件的方法。为了让它不冻结我的 UI,我从一个任务中运行了解压缩命令。
当解压任务调用 ContinueWith 以继续并在该 ContinueWith 内我调用另一个方法,然后继续我的应用程序逻辑。我的逻辑中的一种方法也需要在任务中运行。问题是,当我使用第二个任务运行该方法时,它似乎并没有在任务中运行并且我的应用程序冻结了。
这是代码:
Task T = new Task(() =>
{
System.IO.Compression.ZipFile.ExtractToDirectory(
Path.Combine(_tempDirectory, "update.zip"),
Path.Combine(_tempDirectory, "update"));
});
Task T2 = T.ContinueWith((previosTask) =>
{
continueUpdate();
}, TaskScheduler.FromCurrentSynchronizationContext());
continue 方法然后有一些逻辑并调用另一个方法:
private void continueUpdate()
{
// some logic
copyTargetFiles();
}
private void copyTargetFiles()
{
Task T = new Task(() =>
{
string backupPath = Path.Combine(_tempDirectory, "Backup\\Files");
Directory.CreateDirectory(backupPath);
string sourceFolder = Shared.GetRegistryKey("Folder");
Infrastructure.Shared.CopyDirectory(sourceFolder, backupPath);
});
T.Start();
}
当它到达 copyTargetFiles 时,应用程序冻结。
有什么建议吗?我做错了什么?
【问题讨论】:
-
您省略的代码与您的问题高度相关。您提供的代码将不会阻塞 UI 线程。
// some logic中的任何内容都会阻塞 UI 线程。
标签: c# .net winforms task-parallel-library