私はWPFを使用しており、メインスレッドはGUI(ウィザード)です。進捗バーWPFを持つbackgroundworkerの2つの問題WPF
ウィザードで[完了]をクリックすると、バックグラウンドワーカーで使用されているユーザープログレスバーを表示する2番目のスレッドが開きます。メインスレッドで
私がやって:私は1によって下記のとおり、私は、バックグラウンドワーカーでそれを使用currentStepという静的変数をインクリメント各createFiles方法で
MessageWithProgressBar progress = new MessageWithProgressBar();
progress.Show();
createFilesInA();
createFilesInB();
createFilesInC();
createFilesInD();
createFilesInE();
createFilesInF();
createFilesInG();
createFilesInH();
createFilesInI();
createFilesInJ();
createFilesInK();
を。バックグラウンドワーカーで
私がやって:
public partial class MessageWithProgressBar : Window
{
private BackgroundWorker backgroundWorker = new BackgroundWorker();
public MessageWithProgressBar()
{
InitializeComponent();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.ProgressChanged += ProgressChanged;
backgroundWorker.DoWork += DoWork;
backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
}
private void DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(100);
int i = GeneralProperties.General.currentStep;
if (i > GeneralProperties.General.thresholdStep)
{
progress.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new DispatcherOperationCallback(delegate
{
progress.Value = 100;
title.Content = progress.Value.ToString();
return null;
}), null);
return;
}
else
{
progress.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new DispatcherOperationCallback(delegate
{
progress.Value = (int)Math.Floor((decimal)(8 * i));
progressLabel.Text = progress.Value.ToString();
return null;
}), null);
}
}
private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progress.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new DispatcherOperationCallback(delegate
{
progress.Value = e.ProgressPercentage;
return null;
}), null);
}
private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progress.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new DispatcherOperationCallback(delegate
{
progress.Value = 100;
title.Content = progress.Value.ToString();
return null;
}), null);
WindowMsgGenDB msg = new WindowMsgGenDB();
msg.Show();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
if (backgroundWorker.IsBusy == false)
{
backgroundWorker.RunWorkerAsync();
}
}
}
currentStepと呼ばれるメインスレッド更新された変数と2番目のスレッドがメインスレッドの進捗状況を報告するためにそれを使用しました。
メインスレッドの操作は、数秒(多くて15秒)
私は2つの問題持って取ります。私はプログレスバーに表示
をする場合にのみcurrentStep = 2(その後、進捗状況は16です)、進捗状況は100であり、すべてのステップが表示されません。
最初は進捗バーが停止しているようです。
(多分それはコールprogress.Show(に接続する)メインスレッドから?)
ありがとう!
バインドを介してプログレスバーの値を設定しますか?または直接? @ –
@直接ヌード。上記のコードを参照してください。 – Programmer
ええええええええええええええええええええええええええええええとお願いします。 –