5

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

如何设置超时BackgroundWorker

4

2 回答 2

4

我的建议如下

backgroundworker1完成工作 - 它接受取消,因此您可以让它停止。

backgroundworker2在超时未决时执行循环,并且超时完成。

如果backgroundworker1仍在运行,则RunWorkerCompletethis 会BackgroundWorker杀死backgroundworker1 ..

这也应该接受取消,以便如果backgroundworker1完成并且仍在运行,您可以取消它。

于 2012-07-03T14:32:26.940 回答
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
            }
        }
    }

如果这并不真正适合您想要完成的任务,您可能会对在实现返回值的函数上的超时实现 C# 通用超时中找到的通用超时解决方案感兴趣。您可以在 BackgroundWorker 中使用它们。

于 2012-07-03T14:57:10.067 回答