我有一个从服务器下载文件的方法。这个工作到目前为止,但只要dl正在进行中,我的UI就会冻结。这是我的方法:
private void DownloadHandler()
{
foreach (var file in SelectedFiles.ToList())
{
var data = new FileData(file.Name, DataType.MeasurementData, SelectedDirectory.Name);
int rc = mFileService.DownloadMeasurementFile(data, SelectedFolderPath, true);
if (rc != 0)
{
//log error
LoggerFactory.Logger.Error("Download file failed!");
...
}
}
}
我想要实现的只是阻止我的UI冻结,我的应用程序不会通过并行化dl来提升性能,因为瓶颈是下载速度。
所以我试过了:
private void DownloadHandler()
{
foreach (var file in SelectedFiles.ToList())
{
var data = new FileData(file.Name, DataType.MeasurementData, SelectedDirectory.Name);
var task = Task.Run(() => mFileService.DownloadMeasurementFile(data, SelectedFolderPath, true));
task.ContinueWith(
t =>
{
if (t.Result != 0)
{
//log error
LoggerFactory.Logger.Error("Download file failed!");
...
}
});
}
}
并在我的DownloadMeasurementFile
方法中添加了一个锁。这应该让我的应用程序调用{{1}}并立即返回(此部分有效)。之后(在我看来)它应该像同步版本一样,因为DownloadHandler
方法内部的锁定。但实际上这会搞砸我对服务器的下载调用,我不明白现在究竟出现了什么问题,但是服务器返回空数据块并且还有其他问题。
所以有人能告诉我我失踪了吗?它不应该这么难,所以将DownloadMeasurementFile
的工作发送到后台线程,然后锁定以同步调用并防止UI冻结?
编辑:
如评论中所述,我将所有下载代码移动到一个新方法中,并启动了一个只调用此方法的任务。
DownloadHandler
这很好用。