簡體   English   中英

BackgroundWorker超時

[英]Timeout for BackgroundWorker

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

如何為BackgroundWorker設置超時

我的建議如下

backgroundworker1完成工作 - 它接受取消,所以你可以讓它停止。

backgroundworker2在超時等待時執行循環,並且超時完成。

如果backgroundworker1仍在運行,則此BackgroundWorkerRunWorkerCompleteRunWorkerComplete backgroundworker1 ..

這也應該接受取消,這樣如果backgroundworker1完成並且仍然在運行,你可以取消它。

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中使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM