0

ディレクトリ内のすべてのファイルを含むディレクトリを自分のディレクトリに追加するオプションをアプリケーションに追加したいのですが、自分ListViewに追加する前に各ファイルをチェックしているためですListView(私のファイルは Wiresahrk ファイルなので、ファイル拡張子をチェックしています。これは pcap 形式ではなく、ファイルを変換してから追加します)、別のスレッドで実行したいので、使用してBackgroundWorkerいて、その方法の助けが必要です:

private void btnAddDir_Click(object sender, EventArgs e)
{
    ListViewItem lv = new ListViewItem();
    string fileToAdd = string.Empty;
    List<string> filesList = new List<string>();
    BackgroundWorker backgroundWorker = null;
    DialogResult dialog = folderBrowserDialog1.ShowDialog();
    if (dialog == DialogResult.OK)
    {
        Editcap editcap = new Editcap();

        foreach (string file in SafeFileEnumerator.EnumerateFiles(folderBrowserDialog1.SelectedPath, "*.*", SearchOption.AllDirectories))
        {
            if (editcap.isWiresharkFormat(file))
            {
                filesList.Add(file);
            }
        }

        backgroundWorker = new BackgroundWorker();
        backgroundWorker.WorkerReportsProgress = true;
        backgroundWorker.DoWork +=
            (s1, e1) =>
            {
                foreach (string fileName in filesList)
                {
                    if (editcap.isWiresharkFormat(fileName))
                    {
                        if (editcap.isLibpcapFormat(fileName))
                        {
                            lv.Text = fileName;
                            lv.SubItems.Add(fileName);
                            lv.SubItems.Add("Waiting");

                            this.Invoke((MethodInvoker)delegate
                            {
                                lvFiles.Items.Add(lv);
                            });

                            lvFiles.Refresh();
                        }
                    }
                }
            };

        backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        (s1, e1) =>
        {

        });

        backgroundWorker.RunWorkerAsync();
    }
}
4

1 に答える 1

1

backgroundWorker.ProgressChangedイベントで項目を追加する代わりに、で行いDoWorkます。

そうしないと、エラーが発生しますCross-thread operation not valid: Control ___ accessed from a thread other than the thread it was created on.

変化する

backgroundWorker.ReportProgress(0, fileToAdd);

lv.SubItems.Add(fileToAdd);

ProgressChangedまた、RunWorkerCompletedイベントを処理する必要はありません。

于 2012-12-25T11:45:51.260 に答える