将工作加载到后台线程

时间:2018-01-16 07:51:46

标签: c#

我有一个从服务器下载文件的方法。这个工作到目前为止,但只要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

这很好用。

0 个答案:

没有答案