2012-01-18 4 views
1

application_deactivatedイベントでのBackgroundWorkerをキャンセルどのくらいの時間がかかるのだろうと思っています。私は労働者を取り消したいだけです。この問題は、イベントハンドラが完了した後、アプリケーションがすべてのスレッドを強制終了し、正しくキャンセルできなくなるという問題があります。私がやりたい何私は私のバックグラウンドワーカーは、Webサービスとの同期が、私はできるとされているWindows PhoneでApplication_Deactivatedイベントで私のバックグラウンドワーカーを取り消すと7</p> <p>の問題を少し持っていますWP7

は次のようなものです:

Application_Deactivated 
{ 
    Backgroundworker.RunWorkerCompleted += bw_completed; 
    Backgroundworker.Cancel async 

    // wait till completed event which confirm the background thread has been cancelled 
} 

は、私が最初のイベントハンドラでAutoResetEventを使用しようとしたが、これは動作しませんApp.xaml.csスレッドがメインである原因このスレッドでこの待機が発生すると、アプリケーション全体がブロックされます。

イベントハンドラでcancelAsyncが呼び出された後、アプリケーションは休止状態になり、実際のバックグラウンドワーカーで呼び出されたWebハンドラを再開すると、Webレスポンスのnull参照に関するエラーが発生します。

私はすでにバックグラウンドワーカーで保留中のキャンセルをチェックしています。キャンセル機能はキャンセルボタンでテストされているため、問題はありません。それは純粋に私は、バックグラウンドワーカーが適切に出るまで待つ必要があるということです。

私はこの1つのように、このサイト上のいくつかの結果が見つかりました: How close BackgroundWorker thread when application is deactivated?

しかし、唯一のThreadAbortExceptionので解決策を与えたが、私はむしろ、このいずれかを使用していないことを。

さらにコードが必要な場合は、それを提供できます。

+0

タイムアウト機能を作成しようとしていますか? –

+0

いいえ、私はバックグラウンドスレッドが中止またはエラーで取り消されるまで、アプリケーションが休止状態になるのを待つことを試みています。私は10秒待つが、アプリケーション全体がハングアップすることなくこの時間を請求する方法を見つけることができません。 – arjanhgroen

+0

[アプリケーションが非アクティブ化されたときのBackgroundWorkerスレッドのクローン数]の可能な複製?](http://stackoverflow.com/questions/7620098/how-close-backgroundworker-thread-when-application-is-deactivated)この質問の答えは、あなたのワーカースレッドで 'CancellationPending'に応答できることを言います - あなたがしなければ' ThreadAbortException'がスローされます。 –

答えて

0

スレッドはバックグラウンドスレッドなのでシャットダウンされています。アプリがシャットダウンすると、すべてのバックグラウンドスレッドがシャットダウンし、これについて何もできません。

フォアグラウンドスレッドを作成できます。アプリはフォアグラウンドスレッドを殺すことはできません。フォアグラウンドスレッドが終了するまで実行されます。あなたはこのような何かをする必要があると思い

は、このメソッドを使用してコールを実行するには、次の

Application_Deactivated 
{ 
    thread t=new Thread(CancelCall); 
    thread.IsBackground=false;//make this a foreground thread 
    thread.Start(); 
} 

private void CancelCall(object state) 
{ 
    Backgroundworker.RunWorkerCompleted += bw_completed; 
    Backgroundworker.Cancel async 
    Thread.Sleep(10000); wait for 10 seconds 
} 

それはBackgroundWorkerのによって作成されたバックグラウンドスレッドがとにかくとてもアプリによってシャットダウンされようとしていることを言及する価値があります私はあなたがこれを行うことで何を得ようとしているのか分かりません。 10秒のシャットダウンではユーザーが幸せにならず、アプリがa)遅いかb)バグがあると不平を言う可能性が高いです。

「bang」が活発に進行中で、ユーザーフィードバックやエラー報告が悪い場合を除き、これをそのまま残すことをお勧めします。

関連する問題