使用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;
        }
    }