2011-12-20 28 views
2

可能性の重複で作成されたスレッド以外のスレッドからアクセス:
Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on例外:有効ではありませんクロススレッド操作:コントロール「pgImportProcess(プログレスバー)」は

この例外を修正する方法:

Cross-thread operation not valid: Control 'pgImportProcess(ProgressBar control)' accessed from a thread other than the thread it was created on.

コード:

フォーム:

private void btnImport_Click(object sender, EventArgs e) 
{ 

     if (CheckDataValidation() == false) return; 

     if (MessageBox.Show("Do you want to import this file?", "Import", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; 
     Cursor.Current = Cursors.WaitCursor; 
     //_blacklist.Process(pgImportProcess); 

     Thread thread = new Thread(new ThreadStart(delegate { _blacklist.Process(pgImportProcess); })); 
     thread.Start(); 

     if (!thread.IsAlive) thread.Abort(); 

     //ThreadStart process = delegate 
     //        { 
     //         _blacklist.Process(pgImportProcess); 
     //        }; 
     //Thread threadProcess = new Thread(process); 
     //threadProcess.Start(); 

     //if(!threadProcess.IsAlive) threadProcess.Abort(); 

    } 

クラス:

public void Process(ProgressBar process) 
{ 

     int same = 0, added = 0, updated = 0; 

     OracleConnection connection = (OracleConnection)DbConnection.Instance(); 
     OracleTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted); 

     process.Step = 1; 
     process.Minimum = 1; 
     process.Maximum = _recordNumber; 



     while (_csv.ReadNextRecord()) 
     { 
      if (_csv[0] == null | _csv[0] == "") break; 

      process.PerformStep(); 

      using (OracleCommand cmd = new OracleCommand(_sql, connection)) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.CommandTimeout = 600; 
       cmd.BindByName = true; 

       switch (_fieldCount) 
       { 
        case SdnName : 
         ImportBlacklistName(cmd); 
         break; 
        case SdnAddress: 
         ImportBlacklistAddress(cmd); 
         break; 
        case SdnAlt : 
         ImportBlacklistAlt(cmd); 
         break; 
       } 

       try 
       { 
        cmd.ExecuteNonQuery(); 


        switch (cmd.Parameters["message_out"].Value.ToString()) 
        { 
         case "Added": 
          added += 1; 
          break; 
         case "Same": 
          same += 1; 
          break; 
         case "Updated": 
          updated += 1; 
          break; 
        } 
       } 
       catch (Exception error) 
       { 
        transaction.Rollback(); 
        MessageBox.Show(error.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       } 
      } 
     } 
     transaction.Commit(); 
     MessageBox.Show(String.Format("Total Record : {0} ; Added : {1} ; Updated : {2} ; Same : {3} !!!!",_recordNumber,added,updated,same), "Import successsfull", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     _recordNumber = 0; 
     process.Value = 1; 
     _csv.Dispose(); 
    } 

それはProcess.stepこの問題を解決するための方法= 1

の時に例外をキャッチ?事前に感謝してください

+0

。あなたはこれらの質問のいくつかを発見したでしょう:[1](http://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control-accessed-from-a-thread-other-than- )、[2](http://stackoverflow.com/questions/5037470/cross-thread-operation-not-valid)、[3](http://stackoverflow.com/questions/4010602/c-sharp-クロススレッドオペレーションは無効です) – Matthias

答えて

1

次のようなデリゲートでBeginInvokeメソッドを使用する必要があります。新しい質問を投稿しようとすると、関連する質問を探してください

MethodInvoker yourAction = delegate 
    { process.Step = 1; 
    process.Minimum = 1; 
    process.Maximum = _recordNumber; }; 
process.BeginInvoke(yourAction); 
1

あなたはUIのスレッドに入るためにDispatcherを使用する必要があります。

あなたがWPFを使用する場合:

Dispatcher.BeginInvoke(new Action(()=> 
{ 
    //place code here 
})); 
+0

私はWPFを使用していません.WAFだけです。 –

2

あなたは(エラー状態など)別のスレッドからのユーザーインターフェイスを更新することはできません。

このメソッドを呼び出す必要があります。これを行うための簡単な方法はMethodInvokerている:

 process.Parent.Invoke((MethodInvoker)delegate 
     { 
      process.Step = 1; 
      process.Minimum = 1; 
      process.Maximum = _recordNumber; 
     }); 

あなたはあなたのプログレスバーのプロパティを更新しようと、このコードをいつでも使用する必要があります。

関連する問題