Задачи и фо-диком


РЕДАКТИРОВАТЬ: проблема перешла в конец, прежде чем все события будут завершены.


У меня проблема с определением задач с помощью библиотеки fo-dicom.

Запрос sendasync, но ответ находится внутри делегата события.

Мой пример кода отправляет запрос (Find Study), получает ответ и порождает другой запрос (Find Series для вышеуказанного исследования), который также имеет ответ. В конце концов мне нужно отправить запрос на перемещение, а затем поставить в очередь задачу проверки, которая отложена.

Я уверен, что у меня просто проблема с моей логикой Tasks/Async.

Образец кода

Список вещей, которые нужно сделать, но Task.WhenAll(t) заканчивается до того, как все события объекта задач завершены.

Как удержать задание, пока событие не будет запущено?

       List<Task<DicomMoveResult>> t = new List<Task<DicomMoveResult>>();
         foreach (var item in dbSet)
         {
            t.Add(DicomMove(item));
         }
         var x = await Task.WhenAll(t);
         Console.WriteLine("Finished");

Метод работы

      private static async Task<DicomMoveResult> DicomMove(DicomMoveRequest request)
            {
                DicomMoveResult r = new DicomMoveResult() { Request = request };

                var client = new DicomClient();

                var cfindStudy = DicomCFindRequest.CreateStudyQuery(accession: request.Accession);

                cfindStudy.OnResponseReceived += async (DicomCFindRequest rq, DicomCFindResponse rp) =>
                {

                    if (rp.Status.State == DicomState.Pending)
                    {
                        if (rp.HasDataset)
                        {
                            var studyInstanceUID = rp.Dataset.Get<string>(DicomTag.StudyInstanceUID);
                            r.StudyId = studyInstanceUID;

                            var cfindSeries = DicomCFindRequest.CreateSeriesQuery(studyInstanceUID);
                            cfindSeries.OnResponseReceived += (DicomCFindRequest srq, DicomCFindResponse srp) =>
                            {
                                if (srp.Status.State == DicomState.Pending)
                                {
                                    if (srp.HasDataset)
                                    {
                                        var seriesInstanceUID = srp.Dataset.Get<string>(DicomTag.SeriesInstanceUID);
                                        r.SeriesId.Add(seriesInstanceUID);

                                    }
                                }


                            };

                            client.AddRequest(cfindSeries);
                            await client.SendAsync(request.PACSIP, request.PACSPort, false, request.CallingAE, request.PACSAE);

                        }

                    }


                };

                client.AddRequest(cfindStudy);
                await client.SendAsync(request.PACSIP, request.PACSPort, false, request.CallingAE, request.PACSAE);

                return r;
            }

0 ответов

Другие вопросы по тегам