我在我的WPF应用程序中使用了。
如何将超时设置为BackgroundWorker?
发布于 2012-07-03 14:32:26
我的建议如下
backgroundworker1做这项工作-它接受取消,这样你就可以让它停止。
backgroundworker2在超时挂起时执行一个循环,并在超时时完成。
如果backgroundworker1仍在运行,则该BackgroundWorker的RunWorkerComplete将关闭backgroundworker1..
这也应该接受cancellation,这样如果backgroundworker1完成并且仍然在运行,您可以取消它。
发布于 2012-07-03 14:57:10
BackgroundWorker不直接支持超时,但它确实支持取消。如果正在完成的工作是一个循环或其他结构,您可以定期检查CancellationPending成员,然后中止,这将很好地工作。您需要一些其他的东西来告诉后台工作人员在超时后取消。这里我使用了一个动作的异步调用。
static void Main( string[] args )
{
var bg = new BackgroundWorker { WorkerSupportsCancellation = true };
bg.DoWork += LongRunningTask;
const int Timeout = 500;
Action a = () =>
{
Thread.Sleep( Timeout );
bg.CancelAsync();
};
a.BeginInvoke( delegate { }, null );
bg.RunWorkerAsync();
Console.ReadKey();
}
private static void LongRunningTask( object sender, DoWorkEventArgs eventArgs )
{
var worker = (BackgroundWorker)sender;
foreach ( var i in Enumerable.Range( 0, 5000 ) )
{
if ( worker.CancellationPending )
{
return;
}
else
{
//Keep working
}
}
}如果这并不符合您想要完成的任务,您可能会对在Implementing a timeout on a function returning a value或Implement C# Generic Timeout中找到的通用超时解决方案感兴趣。您可以在BackgroundWorker内部使用这些。
https://stackoverflow.com/questions/11313122
复制相似问题