2016-10-05 1 views
1

バックグラウンドワーカーを使用してテキストラベルを継続的に更新しようとしていますが、DoWorkの場合、ループを使用しないと一度だけ実行されますが、無限ループを使用するとGUIがフリーズ、これを解決するための任意のアイデア?本当に感謝します!私はC#で新しく、まだ勉強しようとしています。C#バックグラウンド作業者がGUIをフリーズしました

ここに私のコードです:メインフォームで

この:

backgroundWorkerX.DoWork += backgroundWorkerX_DoWork; 
backgroundWorkerX.ProgressChanged += backgroundWorkerX_ProgressChanged; 
backgroundWorkerX.WorkerReportsProgress = true; 
backgroundWorkerX.RunWorkerAsync(); 

その後:

public void backgroundWorkerX_DoWork(object sender, DoWorkEventArgs e) 
{ 
    X = -(RSSI_PI1_ST1); 
    backgroundWorkerX.ReportProgress(X); 
} 


public void backgroundWorkerX_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    label9.Text = e.ProgressPercentage.ToString(); 
} 

public void backgroundWorkerX_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 

} 
+1

_ "無限ループを使用するとGUI" _ - whatループ? – MickyD

+0

とにかく、あなたのループが 'ReportProgress'を含む非常に_tight_なら、それはすべてマーシャリングで物事を遅くするでしょう – MickyD

+0

クイックレスポンスのおかげで、" public void backgroundWorkerX_DoWork "の下にループを置くと、データが変化しているのを見て、誰かがDoWorkの中に無限ループを置くことはできないと言っていますが、プログラムはこのループでループし続けますが、それを解決する方法はわかりませんでした... – tedhan

答えて

2

[...]何のループを使用しない場合には、それだけで実行されます1回

これは予想される動作です。期待通りのことをしてからRunWorkerCompletedに電話してください。

[...]ただし、無限ループを使用すると、GUIがフリーズします。

あなたの質問にはループはありません。だから、私は前提をつけて、実際にすべてのCPUを消費し、したがってGUIをクラッシュさせる教育を受けたの推測をに与えます。

// I assume that you loop like this somehow. 
do 
{ 
    X = -(RSSI_PI1_ST1); 
    backgroundWorkerX.ReportProgress(X); 
} while (true); 

たまにを「それをスローダウン」に何かを追加してみてください。さもなければ、それはちょうど実行され、できるだけ速く動くので、利用可能なすべてのCPUを消費します。 ReportProgressを使用するたびに、GUIスレッドによってレンダリングされることに注意してください。そして、これはを頻繁にと実行し、GUIスレッドが他のものに応答するための多くのリソースを残しません。私はを使用します。これは、スレッドを0.5秒間一時停止します。しかし、これはバックグラウンドスレッドでのみ行うことを忘れないでください。

do 
{ 
    X = -(RSSI_PI1_ST1); 
    backgroundWorkerX.ReportProgress(X); 
    Thread.Sleep(500); 
} while (true); 

私はこれを別の方法で行うことも考えます。実際にスレッドを一時停止する必要がある場合は、Timerで行うこともできます。 Thread.Sleepはスレッドをロックするので、本当に必要なものではない可能性があります。 this answer

Process() // method to be called after regular interval in Timer 
{ 
    // lengthy process, i.e. data fetching and processing etc. 

    // here comes the UI update part 
    Dispatcher.Invoke((Action)delegate() { /* update UI */ }); 
} 
+0

ありがとう!! !私はCPUを無駄に消費するという問題があり、それを解決しても遅れが出ます!これほど多くのことをありがとう!!! – tedhan

+0

@tedhanもちろん、遅延を追加することは、最初にスレッドを使用することと逆効果です – MickyD

関連する問題