これはダイアログを使用するのが最適です。自動的に残りのUIにアクセスできなくなります。プロジェクトに新しいフォームを追加し、ProgressBarとボタンをドロップします。そして、あなたはあなたのメインフォームのイベントハンドラからプログレスバーを更新できるようにパブリックメソッドを追加します。
public partial class ProgressDialog : Form {
public ProgressDialog() {
InitializeComponent();
}
public void ShowProgress(int progress) {
progressBar1.Value = progress;
}
private void CancelProcess_Click(object sender, EventArgs e) {
this.DialogResult = DialogResult.Cancel;
}
}
をあなたは労働者を起動したときにダイアログを表示する必要があります:
ProgressDialog dlg;
private void RunProcess_Click(object sender, EventArgs e) {
backgroundWorker1.RunWorkerAsync();
using (dlg = new ProgressDialog()) {
dlg.ShowDialog(this);
}
dlg = null;
if (backgroundWorker1.IsBusy) backgroundWorker1.CancelAsync();
}
注意を作業者を停止させるためにCancelAsync()を呼び出す方法は、ダイアログを閉じることで止めることができます。
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
dlg.ShowProgress(e.ProgressPercentage);
}
そして、あなたは労働者が完了したときに自動的にダイアログを閉じるには、ユーザーがダイアログに自分自身を閉じていない必要があります:あなたは、プログレスバーを更新する必要があります
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
if (dlg != null) dlg.Close();
}
私が書いたはずです
その特別なプロセスのコードは?if(backgroundWorker1.IsBusy)backgroundWorker1.CancelAsync();という行の下にそれらを書きました。そのプロセスを実行した後、新しいフォームが有効にされ、何も表示されませんでした。この問題をどのように解決できますか? –
バックグラウンドワーカーのDoWork()イベントハンドラに記述します。 –
その問題は解決されましたが、別の問題が解決されました。そのプロセスでは、フォーム上にあるいくつかのコントロールにアクセスする必要があります。たとえば、opBという名前のボタンを無効にして、プロジェクトを実行するとcoltrols.このエラー:「クロススレッド操作が無効です:作成されたスレッド以外のスレッドからアクセスする 'opB'を制御します。私は今どうすればいい? –