5

私はSystem.ComponentModel.BackgroundWorker自分のWPFアプリケーションで使用しています。

のタイムアウトを設定するにはどうすればよいBackgroundWorkerですか?

4

2 に答える 2

4

私の提案は次のとおりです

backgroundworker1が作業を行います - キャンセルを受け入れるので、停止させることができます。

タイムアウトが保留中の間、backgroundworker2はループを実行し、タイムアウトになると完了します。

backgroundworker1がまだ実行中の場合RunWorkerComplete、 thisの はbackgroundworker1BackgroundWorkerを強制終了します。

これはキャンセルも受け入れる必要があるため、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 に答える