2017-12-13 15 views
0

Backgroundworkerを使用して、メインUIスレッドを開いたままにして、フリーズしないようにしています。私はコードを実行していて、一度ヒットしたばかりのbackgroundWorker1.RunWorkerAsync();の両方にブレークポイントを設定しており、決してヒットしなかったforeach行目にブレークポイントを設定しています。BackgroundWorkerイベントが実行されない

バックグラウンドワーカーを使用する適切な方法は何ですか?

public Form1() 
{ 
    InitializeComponent(); 
    backgroundWorker1.WorkerReportsProgress = true; 
    backgroundWorker1.WorkerSupportsCancellation = true; 
} 
private void btnQuery_Click(object sender, EventArgs e) 
{ 
    grid1.Rows.Clear(); 
    backgroundWorker1.RunWorkerAsync(); 
} 
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    foreach (string name in studentRoster) 
    { 
     InsertIntoDB(); 
    } 
} 
+0

あなたの背景労働者が使用中であるかどうかを確認します。すでに実行中の場合は、再び実行されません。 'if(!backgroundWorker1.IsBusy) { \t backgroundWorker1.RunWorkerAsync(); } ' – Baddack

+0

これはビジーではありません。あなたの構文で確認しました:) – IcyPopTarts

+1

'backgroundWorker1 + = backgroundWorker1_DoWork'が存在することを確認してください。多分Form1.designer.csにありますか? – skyoxZ

答えて

0

ここにハンドラが追加されたコードといくつかのコメントがあります。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     backgroundWorker1.WorkerReportsProgress = true; 
     backgroundWorker1.WorkerSupportsCancellation = true; 
     backgroundWorker1.DoWork += new DoWorkEventHandler(BackgroundWorker_DoWork); 
     backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(BackgroundWorker_ProgressChanged); 
     backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundWorker_RunWorkerCompleted); 

    } 
    private void btnQuery_Click(object sender, EventArgs e) 
    { 
     grid1.Rows.Clear(); 
     backgroundWorker1.RunWorkerAsync(); 
    } 
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     foreach (string name in studentRoster) 
     { 
      InsertIntoDB(); 

      // You can report progress by calling the following function. 
      //backgroundWorker1.ReportProgress(int percentProgress, object userState) 
      // You can set the percentProgress to any valid integer value, 
      // and userState can be any object you want. 

      // You can also check to see if this operation has been sent a request to cancel. 
      if (backgroundWorker1.CancellationPending) 
      { 
       e.Cancel = true; 
       return; 
      } 
     } 

     // You can send information back to the main thread by setting e.Result to any object you want. 
    } 
    private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     // Do something with the event that is being raised. 
     // To pass a value back through to this event, use the percentProgress and userState 
     // parameters of the ReportProgress function. 
     // the userState object that you pass will be received here as e.UserState 
    } 
    private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     // This event is raised by the background worker when the DoWork method is completed. 
     // You can receive information back from the worker thread by evaluating e.Result 
    } 
} 

}

関連する問題