2016-10-05 3 views
0

なぜ "ListViewItem lviFile = lvFiles.Items [i];" ListView引数にDoWorkEventArgs eを使用しても、スレッド間エラーですか?BackgroundWorkerクロススレッドエラーListView引数

private void btUpload_Click(object sender, EventArgs e) 
{ 
    bwUpload.RunWorkerAsync(lvFiles); 
} 

private void bwUpload_DoWork(object sender, DoWorkEventArgs e) 
{ 
    ListView lvFiles = (ListView)e.Argument; 

    for (int i = 0; i < lvFiles.Items.Count; i++) 
    { 
     ListViewItem lviFile = lviFile.Items[i]; 
     ... 
    } 
} 

答えて

2

あなたが別のスレッドからアクセスしているので、あなたがそれを使用するためにInvokeを使用する必要があります。

private void btUpload_Click(object sender, EventArgs e) 
{ 
    bwUpload.RunWorkerAsync(lvFiles); 
} 

private void bwUpload_DoWork(object sender, DoWorkEventArgs e) 
{ 
    ListView lvFiles = (ListView)e.Argument; 

    for (int i = 0; i < lvFiles.Items.Count; i++) 
    { 
     Invoke(new MethodInvoker(() => 
     { 
      ListViewItem lviFile = lviFile.Items[i]; 
      ... 
     }); 
    } 
} 
+0

Invoke()内にすべて記述するか、Invoke()外のListViewItemにどのようにアクセスできますか?それは、Invoke()の内部にすべてを書き込むと、デバッグのために複雑に思えます... – xyqw

+0

呼び出しの外側にアクセスすることはできません。なぜなら、そこには... – ThePerplexedOne

0

コントロールを使用する場合。あなたは、コントロールを作成されたスレッドでタスクを起動する必要があります。

詳細情報Here

0

あなたはDoWork()方法から変更してUIを更新するためにBackgroundWorker.ProgressChangedを使用する必要があります。 BackgroundWorkerReportProgress()を呼び出すと、を第2引数として渡して、ProgressChangedイベントで使用できます。

+0

DoWork()の実行中にListViewを更新したくありません。 。 ListViewItemの値が必要です... – xyqw

+0

しかし、問題を引き起こしている別のスレッドで 'lvFiles'にアクセスしています。 'ProgressChanged'は例外なくこれらの値にアクセスできます。 – Ric

+0

ありがとう、私はそれを試して – xyqw