BackgroundWorker超时

时间:2012-07-03 14:29:17

标签: c# wpf timeout backgroundworker

我在 WPF 应用程序中使用System.ComponentModel.BackgroundWorker

如何为BackgroundWorker设置超时

2 个答案:

答案 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 valueImplement C# Generic Timeout中的通用超时解决方案感兴趣。您可以在BackgroundWorker中使用它们。