0

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 参照例外が発生します。これにより、イベントが別のスレッドでトリガーされていると信じる理由が得られるため、ブレークポイントが本来あるべきスレッドにヒットしていませんか?

4

2 に答える 2

1

Form/Control.InvokeRequiredイベント ハンドラーで、Windows フォーム コントロールを操作する場合は、を確認する必要があります。 aspx

true の場合、UI スレッドとは別のスレッドから呼び出されています。その場合Form/Control.Invoke、UI スレッドでイベントをキューに入れるために使用します

参照: http://msdn.microsoft.com/en-us/library/ms171728(v=vs.85).aspx

于 2013-10-12T10:59:52.013 に答える