我正在爲一個網站編寫視頻轉換工具。使用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;
}
}
PPS。這是我第一次使用異步/等待:) – 2012-07-31 20:56:14
等待不會返回,直到轉換完成,是否轉換完成? – Frobzig 2012-07-31 21:10:40
你有沒有試過這個教程? http://msdn.microsoft.com/en-us/library/hh300224(v=vs.110).aspx – cshemby 2012-07-31 21:13:51