-1

ある Web サイト用のビデオ変換ツールを書いています。

次はロジック

  • ユーザーがファイルをアップロード
  • システムはユーザーのためにそれを変換します(もちろん、ユーザーは変換中に待つべきではありません)

私はコードをもっている:

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)に交換する場合は、すべてが機能し始めます。したがって、問題は2番目の方法にあると思います。

だから私は次のファイルコードを追加しています(今ドラフト):

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 要求を完了する前に、 AddVideoreturnTaskとその結果を作成する必要があります。await

更新:Wait非同期で やその他のブロッキング メソッドを呼び出さないでTaskください。これにより、デッドロックが発生します。

私のasyncイントロが役に立つかもしれません。

PSasyncは HTTP の動作方法を変更しません。リクエストごとに 1 つの応答しかありません。エンド ユーザー (ブラウザーなど) をブロックしないようにする場合は、ブラウザーがビデオ変換ジョブを開始し、その結果を通知できるキュー システムを実装する必要があります (SignalR を使用するなど)。async魔法のようにこれを実現するだけではなく、単一のリクエスト/レスポンス ペアのコンテキスト内でのみ機能します。

于 2012-07-31T21:36:36.547 に答える
1

ConfigureAwait(false) を追加すると、リクエストスレッドで継続が強制されなくなります

于 2012-07-31T23:05:24.600 に答える