-1

我正在为一个网站编写视频转换工具。

接下来是逻辑

  • 用户上传文件
  • 系统为用户转换(当然用户在转换时不应该等待)

我有一个代码:

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
}

- - 更新 - -

刚刚得到了有趣的东西。如果我要交换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;
        }
    }   
4

2 回答 2

2

在完成 ASP.NET 请求之前,您需要进行AddVideoreturn及其结果。Taskawait

更新:不要Wait在异步上调用或其他阻塞方法Task这会导致死锁。

你可能会发现我的async介绍很有帮助。

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

于 2012-07-31T21:36:36.547 回答
1

添加 ConfigureAwait(false) 将防止继续在请求线程上被强制

于 2012-07-31T23:05:24.600 回答