none
BackgroundWorker のスレッドデバックについて RRS feed

  • 質問

  • こんにちは。

    BackGroundWorkerでの処理を記述した所、問題なく動作したのですが、

    スレッド内での処理を見ようとブレークポイントを設置(ソース14行目)した所、

    ブレークポイントでの停止はされたものの、F5で継続した所、DoWorkを処理中のスレッドが停止した様になりCompletedメソッドが呼ばれない状態になりました。

    スレッド内でコードデバッカを正しく使うにはどうしたら良いでしょうか?

    ひょっとするとスレッド利用方法の低次元の問題かもしれませんがよろしくお願いします。

    001 namespace BackGroundWorkerTest
    002 {
    003     public partial class Form1 : Form
    004     {
    005         public Form1()
    006         {
    007             InitializeComponent();
    008         }
    009
    010         private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    011         {
    012             for(int i=0;i<=100;i+=1)
    013             {
    014                 Thread.Sleep(20);
    015
    016                 if (backgroundWorker1.CancellationPending)
    017                 {
    018                     e.Cancel = true;
    019                     break;
    020                 }
    021                
    022                 backgroundWorker1.ReportProgress(i);
    023             }
    024         }
    025
    026         private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    027         {
    028             progressBar1.Value = e.ProgressPercentage;
    029         }
    030
    031         private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    032         {
    033             if (e.Cancelled)
    034             {
    035                 textBox1.Text = "Canceled!";
    036             }
    037             else
    038             {
    039                 textBox1.Text = "Done!";
    040             }
    041             button1.Enabled = true;
    042             button2.Enabled = false;
    043         }
    044
    045         private void button1_Click(object sender, EventArgs e)
    046         {
    047             button1.Enabled = false;
    048             button2.Enabled = true;
    049
    050             textBox1.Text = "In Progress";
    051             backgroundWorker1.RunWorkerAsync();
    052         }
    053
    054         private void button2_Click(object sender, EventArgs e)
    055         {
    056             button1.Enabled = true;
    057             button2.Enabled = false;
    058
    059             backgroundWorker1.CancelAsync();
    060         }
    061
    062     }
    063 }

    2006年5月22日 5:41

回答

  • 自己レスです。

    プログラム実行後、[デバッグ]-[ウィンドウ]-[スレッド]でスレッドウィンドウを表示させた状態でデバックすると正常に動作させる事ができました。

    表示していない状態に関する説明はマニュアルを見てもなさそうなのですが、解決したのでレスしました。

    ・方法 : [スレッド] ウィンドウを使用する

    http://msdn2.microsoft.com/ja-jp/library/w15yf86f.aspx

    2006年6月16日 5:31