2012-07-31 41 views
-1

我正在为一个网站编写视频转换工具。使用c#等待后,部分代码无法访问

Logic是下一个

  • 用户上传的文件
  • 系统CONVER它为用户(而转换当然用户不应等待)

我有一个代码:

public async void AddVideo(HotelVideosViewModel model) 
     { 
      var sourceFile = FileHandler.SaveFile(model.VideoFile); 
      var fullFilePath = HttpContext.Current.Server.MapPath(sourceFile); 

      await Task.Factory.StartNew(() => video.Convert(fullFilePath)); 

      model.FileLocation = sourceFile; 
      model.IsConverted = true; 
      this.Add<HotelVideos>(Mapper.Map<HotelVideosViewModel, HotelVideos>(model)); 
     } 

此开始编码:

await Task.Factory.StartNew(() => video.Convert(fullFilePath)); 

但是之后的代码永远不会执行......有人有解决方案吗?

PS:下video.Conver(...)是有这样的事:

public bool Convert(string fileLocation) 
{ 
// do staff 
} 

--- UPDATE ---

刚拿到有趣的事情。如果我要将video.Convert(fullFilePath)换成Thread.Sleep(2000),一切都开始奏效。所以问题在于我想第二种方法。

所以我添加下一个文件的代码(草案至今):

using Softpae.Media; 

    /// <summary> 
    /// TODO: Update summary. 
    /// </summary> 
    public class VideoConvertManager 
    { 
     private readonly Job2Convert jobConverter = new Job2Convert(); 

     private readonly MediaServer mediaServer = new MediaServer(); 

     public bool Convert(string fileLocation) 
     { 
      this.jobConverter.pszSrcFile = fileLocation; 
      this.jobConverter.pszDstFile = fileLocation + ".mp4"; 
      this.jobConverter.pszDstFormat = "mp4"; 
      this.jobConverter.pszAudioCodec = null; 
      this.jobConverter.pszVideoCodec = "h264"; 

      if (this.mediaServer.ConvertFile(this.jobConverter)) 
      { 
       FileHandler.DeleteFile(fileLocation); 
       return true; 
      }; 

      FileHandler.DeleteFile(fileLocation); 
      return false; 
     } 
    } 
+0

PPS。这是我第一次使用异步/等待:) – 2012-07-31 20:56:14

+0

等待不会返回,直到转换完成,是否转换完成? – Frobzig 2012-07-31 21:10:40

+0

你有没有试过这个教程? http://msdn.microsoft.com/en-us/library/hh300224(v=vs.110).aspx – cshemby 2012-07-31 21:13:51

回答

1

添加ConfigureAwait(false)将保持在请求线程上被强制延续

+0

在ASP.NET中,不使用'ConfigureAwait(false)'意味着继续将在request * context *上。但这并不意味着它必须是开始请求的同一个线程,它也不应该导致这个问题。 – svick 2012-08-01 06:31:09

2

你需要让AddVideo回报Taskawait其完成ASP.NET请求之前的结果。

更新:不要在异步Task上调用Wait或其他阻塞方法! This causes deadlock.

您可能会发现my async intro有帮助。

P.S. async不会改变HTTP的工作方式。每个请求仍然只有一个响应。如果您希望最终用户(例如浏览器)不阻塞,那么您必须实现某种类型的队列系统,浏览器可以启动视频转换作业并通知其结果(例如,使用SignalR)。 async不仅仅是神奇般地发生这种情况 - 它只在单个请求/响应对的上下文中起作用。

+0

你好,谢谢你的回答。我试图让AddVideo成为一项任务 - 同样的故事。 PS。我更新了描述 – 2012-07-31 21:48:44

+0

需要了解更多关于SignalR的信息,听起来像是一个有用的工具 – 2012-07-31 21:50:02

+0

@EvgeniyLabunskiy:你在等待它吗? – 2012-07-31 22:25:13