Проблемы с параллельным парсингом

Рейтинг: 0Ответов: 1Опубликовано: 24.04.2023

Нет понимания по какой причине при запуске программы происходит моментальное завершение. Смысл заключается в том, что есть базовые ссылки, которые дают данные с локального + ещё ряд айдишников, по которым также можно обратиться на локальный сервер и получить ещё больше данных. Нужно это как можно быстрее спарсить, поэтому идея такова, что на каждый новый айдишник создаю новый поток и в нём начинаю обращаться по каждому отдельному айдишнику. Но при попытке парсинга, программа моментально завершается. Как я понимаю, завершая основной поток, либо парсинг идет по какой-то причине ооочень медленно.

Dictionary<string, string> Datas = new()
{
    {"Instances","http://localhost:8042/instances" },
    {"Series","http://localhost:8042/series" },
    {"Patients","http://localhost:8042/patients" },
    {"Studies","http://localhost:8042/studies" }
};

HttpClient httpClient = new();
var PatientsTask = Task.Run(() => { PatientDataGetter(Datas.GetValueOrDefault("Patients")); });
var StudyTask = Task.Run(() => { StudyDataGetter(Datas.GetValueOrDefault("Studies")); });
var SeriesTask = Task.Run(() => { SerieeDataGetter(Datas.GetValueOrDefault("Series")); });
var InstancesTask = Task.Run(() => { InstanceDataGetter(Datas.GetValueOrDefault("Instances")); });

async Task PatientDataGetter(string url)
    
{
        var PatientsIDs = JsonConvert.DeserializeObject<List<string>>(await httpClient.GetStringAsync(url));
        int index = 0;
        foreach (var item in PatientsIDs)
        {
            index++;
            Patient? patient = new Patient();
            patient = JsonConvert.DeserializeObject<Patient>(await httpClient.GetStringAsync($"{url}/{item}"));
            patient.Path = $"{url}/{item}";
            PatientDateConverter(patient);
            Console.SetCursorPosition(0, 0);
            Console.Write($"Пациент {index}/{PatientsIDs.Count()}");

        }
}

async Task SerieeDataGetter(string url)
{
        var SerieeIDs = JsonConvert.DeserializeObject<List<string>>(await httpClient.GetStringAsync(url));
        int index = 0;
        foreach (var item in SerieeIDs)
        {
            index++;
            Seriee? seriee = new Seriee();
            seriee = JsonConvert.DeserializeObject<Seriee>(await httpClient.GetStringAsync($"{url}/{item}"));
            seriee.Path = $"{url}/{item}";
            Console.SetCursorPosition(0, 1);
            Console.Write($"Серия {index}/{SerieeIDs.Count()}");

        }
}
async Task InstanceDataGetter(string url)
{
    
        var InstanceIDs = JsonConvert.DeserializeObject<List<string>>(await httpClient.GetStringAsync(url));
        int index = 0;
        foreach (var item in InstanceIDs)
        {
            index++;
            Instance? instance = new Instance();
            instance = JsonConvert.DeserializeObject<Instance>(await httpClient.GetStringAsync($"{url}/{item}"));
            instance.Path = $"{url}/{item}";
            Console.SetCursorPosition(0, 2);
            Console.Write($"Экземпляр {index}/{InstanceIDs.Count()}");

        }
}
async Task StudyDataGetter(string url)
{
    
        var StudyIDs = JsonConvert.DeserializeObject<List<string>>(await httpClient.GetStringAsync(url));
        int index = 0;
        foreach (var item in StudyIDs)
        {
            index++;
            Study? study = new Study();
            study = JsonConvert.DeserializeObject<Study>(await httpClient.GetStringAsync($"{url}/{item}"));
            study.Path = $"{Datas.GetValueOrDefault("Studies")}/{item}";
            StudyDateConverter(study);
            Console.SetCursorPosition(0, 3);
            Console.Write($"Исследование {index}/{StudyIDs.Count()}");

        }
}

Ответы

▲ 0Принят

Таски запустили, а ждать их кто будет?

Добавьте в конец кода

await Task.WhenAll(PatientsTask, StudyTask, SeriesTask, InstancesTask);

Запомните правило. Если есть Task, значит его надо где-то использовать. А ваши без дела получены были.