gpt4 book ai didi

c# - 在 ASP.NET 中获取两个等待已久的并发进程的正确进度更新

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:28 25 4
gpt4 key购买 nike

我使用 .net ffmpeg 包装器实现了后台视频处理 http://www.mediasoftpro.com带有进度条指示以计算处理了多少视频并将信息发送到网页以更新进度条指示器。如果一次只有一个进程工作,它工作正常,但在两个并发进程的情况下(从两台不同的计算机同时启动两个视频发布),进度条突然混合进度状态。这是我的代码,其中我使用静态对象将单个实例的信息正确发送到进度条。

static string FileName = "grey_03";
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if (Request.Params["file"] != null)
{
FileName = Request.Params["file"].ToString();
}
}
}
public static double ProgressValue = 0;
public static MediaHandler _mhandler = new MediaHandler();

[WebMethod]
public static string EncodeVideo()
{
// MediaHandler _mhandler = new MediaHandler();
string RootPath = HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath);
_mhandler.FFMPEGPath = HttpContext.Current.Server.MapPath("~\\ffmpeg_july_2012\\bin\\ffmpeg.exe");
_mhandler.InputPath = RootPath + "\\contents\\original";
_mhandler.OutputPath = RootPath + "\\contents\\mp4";
_mhandler.BackgroundProcessing = true;
_mhandler.FileName = "Grey.avi";
_mhandler.OutputFileName =FileName;
string presetpath = RootPath + "\\ffmpeg_july_2012\\presets\\libx264-ipod640.ffpreset";
_mhandler.Parameters = " -b:a 192k -b:v 500k -fpre \"" + presetpath + "\"";
_mhandler.OutputExtension = ".mp4";
_mhandler.VCodec = "libx264";
_mhandler.ACodec = "libvo_aacenc";
_mhandler.Channel = 2;
_mhandler.ProcessMedia();
return _mhandler.vinfo.ErrorCode.ToString();
}

[WebMethod]
public static string GetProgressStatus()
{
return Math.Round(_mhandler.vinfo.ProcessingCompleted, 2).ToString();
// if vinfo.processingcomplete==100, then you can get complete information from vinfo object and store it in database and perform other processing.
}

这里是 jquery 函数,负责每秒更新一次进度条指示。

$(function () {
$("#vprocess").on({
click: function (e) {
ProcessEncoding();
var IntervalID = setInterval(function () {
GetProgressValue(IntervalID);
}, 1000);
return false;
}
}, '#btn_process');

});
function GetProgressValue(intervalid) {
$.ajax({
type: "POST",
url: "concurrent_03.aspx/GetProgressStatus",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
// Do something interesting here.
$("#pstats").text(msg.d);
$("#pbar_int_01").attr('style', 'width: ' + msg.d + '%;');
if (msg.d == "100") {
$('#pbar01').removeClass("progress-danger");
$('#pbar01').addClass("progress-success");
if (intervalid != 0) {
clearInterval(intervalid);
}
FetchInfo();
}
}
});
}

问题是由于静态媒体处理程序对象引起的

public static MediaHandler _mhandler = new MediaHandler();

我需要一种方法来保持两个并发进程的信息彼此分离,以便使用完全属于该进程的值更新进度条。

最佳答案

我认为你对这里有误解。

因为您使用的是 static 变量,所以您遇到了并发问题。这是因为在 ASP.NET 中,static 变量由所有请求共享,因为它们是每个 AppDomain 一次,直到应用程序池回收。

您应该公开一个 WCF 端点,您可以使用它来询问您的服务是否已完成。该服务应该在一个队列中工作,并为队列中的每个项目调用您的 ffmpeg 程序。您没有提到有多少用户将调用您的页面,但以这种方式设计它可能更好,这样您就可以更简单地控制允许服务器一次处理多少项目。您还会遇到更少的问题,因为您是在服务上下文而不是 ASP.NET 下运行进程。

关于c# - 在 ASP.NET 中获取两个等待已久的并发进程的正确进度更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11512235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com