@Bibort

Как найти где NullReferenceException?

Добрый день.
Подскажите, как поймать неуловимый null?

Есть программа с таким методом:

private async Task checkFile(string path)
        {
            var fileType = await getFileAsync(path);
            
                if (fileType.FileExtension != "None")
                {
                    try
                    {
                        if (this.filesMap == null) Console.WriteLine("Map is null");
                        if (path == null) Console.WriteLine("path is null");
                        if (fileType == null) Console.WriteLine("type is null");

                        this.filesMap.Add(path, fileType);
                    }
                    catch(Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                    
                }
            
        }


На выборке из 20000 файлов один раз из пяти запусков программы выпадает NullReferenceException при добавлении элемента в дикшинари filesMap.Add, в самом начале работы программы, когда размер мапы два - три элемента. Спотыкается каждый раз на разных файлах.

Все три переменные, которые содержатся в этом коде (path, fileType, filesMap) в момент ошибки содержат какое-то значение, я даже вот эти врайтлайны поставил, чтобы убедиться что не сошёл с ума. Они ничего в консоль не выводят.

Ещё, трай кетч не обрабатывает ошибку автоматически, и студия останавливает работу программы. Если продолжить, то exception из кетча выведется в консоль, и следом будет вторая такая же ошибка. Дальше до конца программа работает нормально. Ошибки случаются только по две, всегда по две. Или не случается ни одной.
Ощущение, будто в dictionary.Add() что-то происходит.

Весь код лежит тут: https://github.com/osija/ImgExtractor/blob/master/...

Картинку с ошибкой прилагаю: 60747be915915833639082.png

Спасибо!
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
twobomb
@twobomb
Хех, так Dictinary же не потокобезопасный. Вам нужна или потокобезопасная коллекция или лок ставьте.
В FileMapper добавьте где-нибудь
private static object locker = new object();
И попробуй переписать на такое

private async Task checkFile(string path)
        {
            var fileType = await getFileAsync(path);
            
                if (fileType.FileExtension != "None")
                {
                      lock(locker){
                        this.filesMap.Add(path, fileType);
}                    
                }
            
        }

P.S. Thread-Safe Collections
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы