0

ファイル検索アプリケーションで、GUI の更新に問題があります(OnPropertyChanged)

チェックしたすべてのディレクトリから始めます。

foreach (string folderPath in dirList) {   
    this.Search (fileSearchPattern, folderPath);
}

このメソッドでは、バックグラウンド ワーカーを開始します...

public void Search(string fileSearchPattern, string folderPath)
{
    BackgroundWorker bw = new BackgroundWorker();
    bw.DoWork += BackgroundSearch;
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundSearchCompleted);
    bw.RunWorkerAsync(new string[] { fileSearchPattern, folderPath });
}

...そして、現在のフォルダー パスのファイル リストを取得します。

private void BackgroundSearch(object sender, DoWorkEventArgs e)
{
    e.Result = new HashSet<string>(
        GetFileList(
            (e.Argument as string[])[0],
            (e.Argument as string[])[1]));
}

ファイル リストを取得したら、イベントを発生させて、アイテムを結果の DataTable に追加します。

void BackgroundSearchCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (this.ItemsAdded != null)
    {
        // fire event files found:
        this.ItemsAdded(e.Result as HashSet<string>);
    }
}

// -------------------------------------------------------------------------------------------

これは、ItemsAdded イベントのイベント ハンドラです。ここでは、すべてのファイルのファイル情報を取得するためにバックグラウンド ワーカーを再度開始します。

public void AddItems(HashSet<string> fileNames)
{
    if (fileNames.Count > 0)
    {
        lock (this.searchResult)
        {
            this.searchResult.BeginLoadData();
            foreach (string n in fileNames)
            {
                this.searchResult.Rows.Add(
                    new object[] {null, null, null, null, null, null, 
                        n // Filename
                });
            }
            this.searchResult.EndLoadData();
        }

        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += BackgroundFileInfo;
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundSearchCompleted);
        bw.RunWorkerAsync();
    }
}

private void BackgroundFileInfo(object sender, DoWorkEventArgs e)
{
    lock (this.searchResult)
    {
        foreach (DataRow row in this.searchResult.Rows)
        {
            FileInfo fi = new FileInfo(row["FULL_NAME"].ToString());
            row.BeginEdit();
            row["FILE_NAME"] = fi.Name;
            row["DIRECTORY_NAME"] = fi.DirectoryName;
            row["ATTRIB"] = fi.Attributes;
            row["CREATION"] = fi.CreationTime.ToShortDateString() + " " +
                fi.CreationTime.ToShortTimeString();
            row["LAST_WRITE"] = fi.LastWriteTime.ToShortDateString() + " " +
                fi.LastWriteTime.ToShortTimeString();
            row["LAST_ACCESS"] = fi.LastAccessTime.ToShortDateString() + " " +
                fi.LastAccessTime.ToShortTimeString();
            row.EndEdit();
        }
        this.searchResult.AcceptChanges();
        }
    }
}

ファイル情報の取得が完了したら、GUI を更新したいのですが、ここで例外「インスタンスが null です」(またはそのようなもの) が発生します。

void BackgroundFileInfoCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    lock (this.searchResult)
    {
        OnPropertyChanged("SearchResult"); // <<== HERE I HAVE AN EXCEPTION!!!
    }
}

このエラーの背後にある理由は何ですか?

4

1 に答える 1