2012-07-31 42 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