2016-03-25 16 views
-2

私はBackgroundworkerを持っていて、作業者が終了するまで読み込み中のgifを表示したい。UIをブロックするBackgroundworkerが終了するまで

私の問題は、それがフレームです更新からそのブロックUIスレッドと私のGIFので、私は

while(worker.IsBusy) 
    Thread.Sleep(50); 

を使用することができないということです。

同じ問題がAutoResetEventとを使用したときに発生するmyAutoResetEvent.WaitOne();

あなたはどのようにBackgroundWorkerのは終了し、まだGIFを表示することができるようにするために待機するように任意のアイデアを持っていますか?

+1

ロードが終了するまで待つ場合は、なぜBackgroundWorkerを使用しますか? – Steve

+3

BackgroundWorkerを使用する目的は、UIがブロックされないようにすることです。バックグラウンドスレッドが意図的に問題を引き起こしてしまわないようにするには、なぜ地球上でですか?ブロックを防ぐためにスレッドを開始して意図的にブロックするのは適切な設計ではないため、問題を再考する必要があります。 –

+0

コード実行中に読み込み中のGIFを表示したいので、BackgroundWorkerを使用しています。 そして、私が仕事のためにBackgroundWorkerを使用しないと、UIはフリーズし、ロード中のGIFを表示しません。 しかし、私はこのGIFをワーカーが働いている間に表示します。 – nauti

答えて

-1

あなたの問題は、UIを更新してブロックしたり、バックグラウンドタスクのステータスを見たりしているようです。

これは、すべてのスレッド(それは同じ価値があるでしょう意味する)のために静的であるTPLと揮発性のブール値を達成することができます:

// in the UI Form add 

private static volatile bool isBackOpRunning = false; 

// when start background operation 
isBackOpRunning = true; 

// when finish background operation 
isBackOpRunning = false; 

// and somewhere in your code 

private void UpdateStatus() 
{ 
    int lag = 1;     // 1 sec 

    while(isBackOpRunning) 
    { 
     this.Invoke(new Action(() => // code to show image here)); 
     Thread.Sleep(lag * 1000); 
    } 

    this.Invoke(new Action(() => // code to hide image here)); 
} 

// and invoke this method in a separate thread (task) 

Task.Factory.StartNew(UpdateStatus); 
1

BackgroundWorkerの全体のポイントは、UIが実行を継続できるようにすることです。

そして、具体的には、BackgroundWorkerが実行されている状態でGIFを更新し続けたいとします。

これは完璧な解決策です。

しかし、明らかに、BackgroundWorkerが実行されている間、UIは「非反復」であることが必要です。まあ、それを行うためのかなり基本的な方法があります。

ここにある:

private void SaveButton_Click(object sender, EventArgs e) 
    { 
     SaveButton.Enabled = false; 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     System.Threading.Thread.Sleep(5000); 
    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     SaveButton.Enabled = true; 
    } 

基本的に、あなただけのあなたと対話するユーザーにしたくないコントロールを無効にしてBackgroundWorkerが行われたときにそれらを再度有効にします。

関連する問題