使用c#wait后,部分代码无法访问
我正在为一个网站编写视频转换工具 接下来是逻辑使用c#wait后,部分代码无法访问,c#,asp.net-mvc-3,asynchronous,async-await,C#,Asp.net Mvc 3,Asynchronous,Async Await,我正在为一个网站编写视频转换工具 接下来是逻辑 用户上传文件 系统为用户转换它(当然用户不应该在转换时等待) 我有一个密码: public async void AddVideo(HotelVideosViewModel model) { var sourceFile = FileHandler.SaveFile(model.VideoFile); var fullFilePath = HttpContext.Current.S
- 用户上传文件
- 系统为用户转换它(当然用户不应该在转换时等待)
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));
}
但这之后的代码永远不会执行。。。有人有解决办法吗
PS:在video.Conver(…)下有如下内容:
public bool Convert(string fileLocation)
{
// do staff
}
---更新---
我刚得到一件有趣的事。如果我要交换video.Convert(fullFilePath)
到Thread.Sleep(2000),一切都开始工作了。所以我认为问题在于第二种方法
因此,我将添加下一个文件代码(草稿):
使用软媒体;
///
///TODO:更新摘要。
///
公共类视频转换管理器
{
私有只读Job2Convert jobConverter=新Job2Convert();
私有只读MediaServer MediaServer=新MediaServer();
公共布尔转换(字符串文件位置)
{
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);
返回true;
};
FileHandler.DeleteFile(fileLocation);
返回false;
}
}
您需要执行AddVideo
返回任务
,并在完成ASP.NET请求之前等待其结果
更新:不要在异步任务上调用等待
或其他阻塞方法
你可能会觉得有用
另外,异步不会改变HTTP的工作方式。每个请求仍然只有一个响应。如果希望最终用户(如浏览器)不阻塞,则必须实现某种队列系统,浏览器可以在其中启动视频转换作业并收到结果通知(如使用信号器)
async
不仅能神奇地实现这一点,它只在单个请求/响应对的上下文中起作用。添加ConfigureAwait(false)将防止在请求线程上强制继续。这是我第一次使用async/await:)await在convert完成之前不会返回,convert完成了吗?您尝试过本教程吗?弗罗比格:当然,检查过了。是的,我看过。什么叫AddVideo?除了需要void返回类型的处理程序外,您通常希望避免使用“async void”。您好,谢谢您的回答。我试着把制作AddVideo作为一项任务——同样的故事。另外,我更新了description@EvgeniyLabunskiy:您是否正在等待它?在ASP.NET中,不使用ConfigureAwait(false)
表示将在请求上下文中继续。但这并不意味着它必须是启动请求的同一线程,也不应该导致这个问题。
public bool Convert(string fileLocation)
{
// do staff
}
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;
}
}