我在 WPF 应用程序中使用System.ComponentModel.BackgroundWorker
。
如何为BackgroundWorker
设置超时?
答案 0 :(得分:4)
我的建议如下:
backgroundworker1 完成工作 - 它接受取消,因此您可以停止。
backgroundworker2 在超时待定时执行循环,并且超时完成。
如果 backgroundworker1 仍在投放,则此RunWorkerComplete
的{{1}}会终止 backgroundworker1 ..
这也应该接受 取消 ,这样如果 backgroundworker1 完成且仍在运行,您可以取消它。
答案 1 :(得分:4)
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中使用它们。