2016-11-16 12 views
0

私はそれを処理する方法がわからないので、誰も私にこの問題を助けることができます。ListViewのスレッドC#

foreach (ListViewItem itemrow in this.listView1.Items) 
{ 
    result = PumpStart.SymbolAdd(itemrow.SubItems[0].Text.Trim()); 
    if(result != ResultCode.Ok) 
    { 
      Console.WriteLine("Error adding symbol. " + mgr.ErrorDescription(result)); 
    } 
} 

しかし、私はプログラムを実行しようとすると、私はこのエラーがあります:

"An exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll but was not handled in user code

Additional information: Cross-thread operation not valid: Control 'listView1' accessed from a thread other than the thread it was created on."

ありがとうございました。

+0

が正しく無効な操作である。この例でActionは、この機能を提供しています。 BackgroundWorkerまたはAsync-Awaitの使用を検討してください –

+0

別のスレッドからUI要素にアクセスしているようです。 「MethodInvoker」がこの問題を解決するのに役立つことを願っています –

+0

私はそれを正しく行う方法の例を教えていただけますか? – Raven

答えて

0

listView1がクロススレッドエラーの原因である場合、データにアクセスして変更するには、InvokeまたはBeginInvokeメソッドを使用する必要があります。 documentationとして

氏は述べています:つまり

The Method executes the specified delegate asynchronously on the thread that the control's underlying handle was created on.

:それはあなたが変更したいControlを作成したスレッドに戻って実行するコードの一部を引っ張ります。

BeginInvokeは、パラメータとしてDelegateを必要とする。 UI制御のみこれは無効演算例外につながる他のスレッド上と、UIスレッドを使用してアクセスし、変更することができるので、

this.listView1.BeginInvoke(
      new Action(() => 
      { 
       foreach (ListViewItem itemrow in this.listView1.Items) 
       { 
        result = PumpStart.SymbolAdd(itemrow.SubItems[0].Text.Trim()); 
        if(result != ResultCode.Ok) 
        { 
         Console.WriteLine("Error adding symbol. " + mgr.ErrorDescription(result)); 
        } 
       } 
      }) 
);