Задачи и фо-диком
РЕДАКТИРОВАТЬ: проблема перешла в конец, прежде чем все события будут завершены.
У меня проблема с определением задач с помощью библиотеки 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;
}