views:

591

answers:

2

how to cancel background worker after specified time in c# or cancel not responding background worker.

+2  A: 

Check out this tutorial: http://www.albahari.com/threading/part3.aspx

In order for a System.ComponentModel.BackgroundWorker thread to support cancellation, you need to set the WorkerSupportsCancellation property to True before starting the thread.

You can then call the .CancelAsync method of the BackgroundWorker to cancel the thread.

TLiebe
i have read the above article, but i need to terminate my background worker after 1 minute
JKS
What about creating a System.Threading.Timer object in your calling thread and set it for 1 minute. When the timer event fires, call the .CancelAsync method of the BackgroundWorker thread.
TLiebe
A: 

BackgroundWorker does not have support either case. Here is the start of some code to support those cases.

class MyBackgroundWorker :BackgroundWorker {
    public MyBackgroundWorker() {
        WorkerReportsProgress = true;
        WorkerSupportsCancellation = true;
    }

    protected override void OnDoWork( DoWorkEventArgs e ) {
        var thread = Thread.CurrentThread;
        using( var cancelTimeout = new System.Threading.Timer( o => CancelAsync(), null, TimeSpan.FromMinutes( 1 ), TimeSpan.Zero ) )
        using( var abortTimeout = new System.Threading.Timer( o => thread.Abort(), null, TimeSpan.FromMinutes( 2 ), TimeSpan.Zero ) ) {
            for( int i = 0; i <= 100; i += 20 ) {
                ReportProgress( i );

                if( CancellationPending ) {
                    e.Cancel = true;
                    return;
                }

                Thread.Sleep( 1000 ); //do work
            }
            e.Result = "My Result";  //report result

            base.OnDoWork( e );
        }
    }
}
jyoung