MVC で FFmpeg を使用してファイル コンバーターを作成しましたが、特定の変換プロセスをキャンセルしようとしています。Encoder クラスでプロセスの ID を取得し、FileController でそれを取得しようとします。ただし、これでは 0 しか返されません。何が問題で、コントローラーで ID を取得するにはどうすればよいですか?
更新: FileController の convert メソッドは、ビューの 2 つのボタンによって呼び出されます。1 つは変換用 (非表示で自動的に開始) で、もう 1 つはキャンセル用です。エンコーダー オブジェクトを Global.asax のセッションに保存してから、変換とキャンセルのためにそれらを再度取得しようとしました。これは機能しますが、セッションを追加したときに、ボタンをクリックしてプロセスをキャンセルしようとすると、convert メソッドがすべて完了するまで何も起こりません。その後、(キューにあったかのように) 再び開始し、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();
}