如何在设置超时后中止 C# 控制台应用程序
How to abort a C# console app after a set timeout
我们有一个由第 3 方组织开发的应用程序,在某些情况下它会挂起而不会正常退出。
这是应用程序的摘要:它接收视频、swf、图像……实际上是任何媒体,并会在特定帧或指定持续时间后捕获缩略图,并将缩略图输出到指定目录。
我正在寻找一种方法来为捕获 Flash 视频的屏幕截图的功能设置超时,这将正确处理表单、Flash 控件并在超过超时时退出应用程序。我可以在应用程序中放置一个计时器或秒表,并定期检查指定的时间是否已超过,但这似乎不是一个非常好的解决方案。一定有更好的方法。
这是函数(它不是很漂亮):
static void ThumbnailForSwf( String inputFile, String outputFile, Int32 w, Int32 h, float? time, float? quality ) {
AxShockwaveFlashObjects.AxShockwaveFlash flash = new AxShockwaveFlashObjects.AxShockwaveFlash();
flash.Location = new System.Drawing.Point( 0, 0 );
flash.ClientSize = new Size( w, h );
flash.Enabled = true;
flash.FSCommand += ( object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e ) => {
switch( e.command ) {
case "trace":
Console.WriteLine( e.args );
break;
case "error":
Console.WriteLine( e.args );
( (Form)( (Control)sender ).Parent ).Close();
break;
case "data":
byte[] data = Convert.FromBase64String( e.args );
using( FileStream fs = File.Open( outputFile, FileMode.Create, FileAccess.Write ) ) {
fs.Write( data, 0, data.Length );
}
break;
case "done":
( (Form)( (Control)sender ).Parent ).Close();
break;
}
};
Form form = new Form();
form.FormBorderStyle = FormBorderStyle.None;
form.ShowInTaskbar = false;
form.Load += ( object sender, EventArgs e ) => {
( (Form)sender ).Visible = false;
( (Form)sender ).ClientSize = new Size( 0, 0 );
try {
flash.AllowNetworking = "all";
flash.AllowScriptAccess = "always";
flash.WMode = "window";
flash.FlashVars = String.Format( "width={0}&height={1}&time={2}&quality={3}&input={4}", w, h, time ?? 0, quality ?? 80, inputFile );
flash.Movie = Path.Combine( AssemblyDirectory, "FlashThumbnail.swf" );
} catch( Exception ex ) {
Console.WriteLine( ex.Message );
( (Form)sender ).Close();
}
};
form.Controls.Add( flash );
flash.CreateControl();
Application.Run( form );
}
您需要将此功能作为任务启动,然后您可以使用 Stopwath 等方式监控任务持续时间,如果 Elapsed 达到某个数字,则终止该任务
我们有一个由第 3 方组织开发的应用程序,在某些情况下它会挂起而不会正常退出。
这是应用程序的摘要:它接收视频、swf、图像……实际上是任何媒体,并会在特定帧或指定持续时间后捕获缩略图,并将缩略图输出到指定目录。
我正在寻找一种方法来为捕获 Flash 视频的屏幕截图的功能设置超时,这将正确处理表单、Flash 控件并在超过超时时退出应用程序。我可以在应用程序中放置一个计时器或秒表,并定期检查指定的时间是否已超过,但这似乎不是一个非常好的解决方案。一定有更好的方法。
这是函数(它不是很漂亮):
static void ThumbnailForSwf( String inputFile, String outputFile, Int32 w, Int32 h, float? time, float? quality ) {
AxShockwaveFlashObjects.AxShockwaveFlash flash = new AxShockwaveFlashObjects.AxShockwaveFlash();
flash.Location = new System.Drawing.Point( 0, 0 );
flash.ClientSize = new Size( w, h );
flash.Enabled = true;
flash.FSCommand += ( object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e ) => {
switch( e.command ) {
case "trace":
Console.WriteLine( e.args );
break;
case "error":
Console.WriteLine( e.args );
( (Form)( (Control)sender ).Parent ).Close();
break;
case "data":
byte[] data = Convert.FromBase64String( e.args );
using( FileStream fs = File.Open( outputFile, FileMode.Create, FileAccess.Write ) ) {
fs.Write( data, 0, data.Length );
}
break;
case "done":
( (Form)( (Control)sender ).Parent ).Close();
break;
}
};
Form form = new Form();
form.FormBorderStyle = FormBorderStyle.None;
form.ShowInTaskbar = false;
form.Load += ( object sender, EventArgs e ) => {
( (Form)sender ).Visible = false;
( (Form)sender ).ClientSize = new Size( 0, 0 );
try {
flash.AllowNetworking = "all";
flash.AllowScriptAccess = "always";
flash.WMode = "window";
flash.FlashVars = String.Format( "width={0}&height={1}&time={2}&quality={3}&input={4}", w, h, time ?? 0, quality ?? 80, inputFile );
flash.Movie = Path.Combine( AssemblyDirectory, "FlashThumbnail.swf" );
} catch( Exception ex ) {
Console.WriteLine( ex.Message );
( (Form)sender ).Close();
}
};
form.Controls.Add( flash );
flash.CreateControl();
Application.Run( form );
}
您需要将此功能作为任务启动,然后您可以使用 Stopwath 等方式监控任务持续时间,如果 Elapsed 达到某个数字,则终止该任务