从模型中检索控制器中的进程ID

时间:2013-05-20 11:44:31

标签: c# asp.net-mvc-4

我在MVC中使用FFmpeg创建了一个文件转换器,现在我正在尝试取消特定的转换过程。我在我的Encoder类中获取进程的ID并尝试在FileController中检索它。但是,这只会给出0.什么是错的,如何在控制器中检索ID?

更新: FileController中的convert方法由视图中的两个按钮调用,一个用于转换(隐藏并自动启动),另一个用于取消。我尝试将编码器对象保存在Global.asax中的会话中,然后再次检索它们以进行转换和取消。这是有效的,但是当我添加会话时,当我尝试通过单击按钮取消该过程时,在转换方法全部完成之前没有任何反应。然后它再次启动(好像它已经在队列中)并转到cancel方法。在此会话之前,取消按钮将中断该方法。

如何让取消按钮中断转换方法?

    //Encoder class
    private string RunProcess(string Parameters, string fileType) {
    //...
    ProcessStartInfo oInfo = new ProcessStartInfo(this.FFmpegPath, Parameters);
    Process proc = System.Diagnostics.Process.Start(oInfo);
    _ID = proc.Id;
    //... }

    private int _ID;
    public int Id {
        get { return _ID; }
        set { _ID = value; }
    }

    //FileController

    [HttpPost]
    public ActionResult Convert(String id, string convert, string kill, string test) {
    //...
    Encoder obj = Session["Encoder"] as Encoder;
    if (convert != null) {
    EncodedVideo encoded = obj.EncodeVideo(inputv, 
    QuickVideoEncodingCommands.Mpeg, outputVPath, true, ext); //Starts encoding
    //...
    } else {
    return KillProcess();
    }}

    public ActionResult KillProcess() {
    Encoder obj = Session["Encoder"] as Encoder;
    int id = obj.Id;
    Process p = Process.GetProcessById(id);
    p.Kill();
    //... }

    //Global.asax
    protected void Session_Start() {
        HttpContext.Current.Session["Encoder"] = new Encoder();
    }

1 个答案:

答案 0 :(得分:0)

这是一个httppost方法,它无法获取在页面加载之前更改了值的公共变量。 您应该将其放入Model并将其从View中发送到Convert方法。或者尝试将其放入SessionTempData,如果是这样,请注意并发情况