Visual Studio 2012 を使用して、Windows フォームの TreeView フォームを拡張するクラスを含む .dll を作成しています。私のカスタム TreeView は FolderTreeView と呼ばれます。その中に、必要ないくつかのプライベート フィールドを追加します。主に、DriveInfo と関連する FileSystemWatcher を含むタプルのリストです。
foreach (DriveInfo.GetDrives() の変数ドライブ) { if (drive.IsReady == true) { FileSystemWatcher ウォッチャー = new FileSystemWatcher(drive.RootDirectory.FullName); //_drives はタプルのリストです _drives.Add(new Tuple<DriveInfo, FileSystemWatcher>(drive, watcher)); watcher.NotifyFilter = NotifyFilters.DirectoryName; watcher.IncludeSubdirectories = true; watcher.Created += 新しい FileSystemEventHandler(FileSystemWatcher_OnCreated); watcher.Changed += 新しい FileSystemEventHandler(FileSystemWatcher_OnChange); watcher.Deleted += 新しい FileSystemEventHandler(FileSystemWatcher_OnDelete); watcher.Renamed += new RenamedEventHandler(FileSystemWatcher_OnRename); watcher.EnableRaisingEvents = true; Nodes.Add(drive.RootDirectory.Name); } }
このコードは 2 つの問題を引き起こします。どちらも偶数ハンドラーに関連していると思われます。最初の問題は、FileSystemWatcher のイベントが別のスレッドから呼び出されることです。他のスレッドは Windows フォームへのアクセスを許可されるべきではないため、例外がスローされます。
2 つ目の問題は、FileSystemWatcher の Renamed イベント ハンドラーを設定したコードがコメント アウトされておらず、Windows エクスプローラーでフォルダー名を変更すると、Visual Studio がクラッシュし、その理由がわかりません。Renamed イベント ハンドラが原因である可能性が非常に高いようです。
これが発生している可能性のある別の理由がない限り、クラッシュを修正できる可能性があるため、最初にスレッドの問題を修正しようとするのを助けてください。また、すべてのファイルシステムとノード構築を別のクラスで処理し、そのクラスからノードを取得して通常の TreeView に渡す方がよいでしょうか?
編集:スレッドに関係していると思います。クラッシュすると、Visual Studio の別のインスタンスでデバッグできますが、ブレークポイントがある場所を過ぎて null 参照例外が発生します。これにより、イベントが別のスレッドでトリガーされていると信じる理由が得られるため、ブレークポイントが本来あるべきスレッドにヒットしていませんか?