2016-01-24 30 views
-2

在一个web mvc项目中。异步映像文件保存

我有以下功能我想使异步,因为我保存了许多文件,它有点慢。我是否需要添加到任务列表,并等待所有:

var fs = new FileSaver(); 
     property.FloorPlanPath = fs.SaveFile(propertyRentalForm.FloorPlanFile, "~/uploads/properties/floorplans"); 
     property.FloorPlan2Path = fs.SaveFile(propertyRentalForm.FloorPlan2File, "~/uploads/properties/floorplans"); 
     property.EpcPath = fs.SaveFile(propertyRentalForm.EpcFile, "~/uploads/properties/epc"); 

    public string SaveFile(HttpPostedFileBase file, string uploadPath) 
    { 

     if (file == null || file.ContentLength <= 0) return ""; 
     var fileName1 = Path.GetFileName(file.FileName); 
     if (fileName1 == null) return ""; 
     // clean file name 
     fileName1 = string.Format("{0}{1}", 
      Path.GetFileNameWithoutExtension(fileName1).GetAliasTitle(), 
      Path.GetExtension(fileName1)); 

     var path = Path.Combine(HttpContext.Current.Server.MapPath(uploadPath), fileName1); 
     file.SaveAs(path); 
     return fileName1; 
    } 
+2

你为什么不使用'BackgroundWorker'? –

+0

你有代码示例,这是一个mvc应用 – matt

+0

你有Google吗? –

回答

0

如果单个磁盘保存这些文件就没有任何意义,使之异步。因为你受到磁盘I/O的限制。但你可以使用队列机制,你可以异步检查队列状态...

+0

因此没有任何优势:var tasks = new List > { Task.Run(()=> fs.SaveFile(propertyRentalForm.FloorPlanFile,“〜/ uploads/properties/floorplans”)), Task.Run (()=> fs.SaveFile(propertyRentalForm.FloorPlanFile,“〜/ uploads/properties/floorplans”)), Task.Run(()=> fs.SaveFile(propertyRentalForm.FloorPlanFile,“〜/ uploads/properties/floorplans “)) }; var results = Task.WhenAll(tasks); – matt

+0

如果您有一个物理硬盘驱动器来保存这些文件,那么没有任何意义。但是你可以在ConcurrentDictionary 中创建这些任务(不要忘记删除完成的任务)(https://msdn.microsoft.com/en-us/library/dd287191(v= vs.110).aspx),你可以检查他们的状态。可能是你想检查辛格尔顿设计模式或'懒惰'(https://msdn.microsoft.com/en-us/library/dd642331(v=vs.110).aspx)。另一个选项是'Threadpool'(https://msdn.microsoft.com/en-us/library/3dasc8as.aspx)。 – efaruk

+1

也不要试图直接保存这些文件,首先创建'MemoryStream'(https://msdn.microsoft.com/en-us/library/system.io.memorystream(v=vs.110).aspx)到将这些文件保存在内存中,然后使用我提到的方法将它们排列在一些队列机制中... – efaruk