3

シナリオ:DataGridのアプリケーションには、onclikcing各行の値がtexboxes以下のように設定されています。値を更新します。[保存] をクリックすると、プロセスが完了するまでに時間がかかります。

そのため、プロセスを実行するためのバックグラウンドワーカーを作成しましたasynchronously。各行がクリックされると、インスタンスbackgroundworkerが作成され、プロセスが完了します。その更新中に、ユーザーはグリッドの 2 番目の行を選択し、その値を更新します。したがって、これにより別のインスタンスが作成され、プロセスがバックグラウンドで実行されます。

ユーザーがグリッドの最初の行を選択すると、両方の更新プロセスが実行されているときに、「プロセスはまだ実行中です」というメッセージが表示されます。

//コード:

' イベントの OnClick

         var bw = new BackgroundWorker();
          bw.WorkerReportsProgress = true;
          bw.DoWork += delegate {
              SaveDetails();
          };
          bw.RunWorkerCompleted += delegate {
              MessageBox.Show("Completed");
          };
          bw.RunWorkerAsync();

'保存方法

 public void SaveDetails()
    {
        for (int i = 0; i < 10;i++ )
        {
            System.Threading.Thread.Sleep(5000);
            MessageBox.Show("Hi");

        }
    }

以前に作成した backgroundworker インスタンスにアクセスして、プロセスのステータスを確認し、メッセージを表示するにはどうすればよいですか?

注:同時に実行されているプロセスが多数ある可能性があるため、どのプロセスにもアクセスできるはずです。

これは可能ですか?

4

4 に答える 4

1

.NET 4.5 を使用している場合は、バックグラウンド スレッドではなく Async/Await を使用して問題を解決することをお勧めします。これは、そのプログラミング スタイルが以下のように簡単で効率的であるためです。

 public partial class Form1 : Form
    {
        List<Task<bool>> taskList = new List<Task<bool>>();
        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {            
            Task<bool> task = Task.Run(() => SaveDetails());
            MessageBox.Show(task.Id + " started.");
            taskList.Add(task);
            var isSuccess = await task;
        }
        public bool SaveDetails()
        {
            for (int i = 0; i < 10; i++)
            {
                System.Threading.Thread.Sleep(5000);
                //MessageBox.Show("Finishing.");                
            }
            return true;
        }       

        private void button2_Click(object sender, EventArgs e)
        {            
            foreach (var task in taskList)
            {                
                if (task.IsCompleted == true)
                    MessageBox.Show(task.Id + " Completed.");
            }        
        }
    }

現在完了しているすべてのタスクにアクセスして表示するために、2 番目のボタン クリック イベントを作成しました。task.Idまた、グリッド行の行識別子として使用できることに注意してください。

それが役立つことを願っています。

于 2013-09-03T09:47:13.827 に答える