Каковы хорошие шаблоны для блокировки/ожидания нескольких ответов межпроцессного взаимодействия, их сбора и последующегоC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Каковы хорошие шаблоны для блокировки/ожидания нескольких ответов межпроцессного взаимодействия, их сбора и последующего

Сообщение Anonymous »

Я работаю над проблемой и пытаюсь понять, что если здесь следует использовать какие-либо асинхронные структуры данных и/или шаблоны. Я копал книгу Стивена Клири о параллелизме в C#, а также некоторые S.O. сообщения в TaskCompletionSource.
Моя проблема в том, что у меня есть процесс, который отправляет сообщение n другим процессам, каждый из которых возвращает некоторое значение/информацию обратно этому процессу через другое сообщение. Мне нужно собрать эти ответы, преобразовать их в ожидаемую структуру данных, а затем отправить обратно в другой процесс.
Мое предположение о том, как это сделать, похоже на псевдокод ниже. Я подумываю о том, чтобы отправить сообщения процессам, создать новый метод под названием «getFormattedResults...», а затем заставить этот метод по существу контролировать структуру данных, думая о словаре, а затем продолжить, когда все эти сообщения будут готовы. Единственная асинхронная часть этого — гарантировать, что мы получим все сообщения обратно и затем вернемся. На самом деле он не кажется асинхронным, поскольку проверяет это в цикле while. Есть ли лучший подход?
// Maybe this task tracking object is the actual message it gets back?
someThreadSafeDictionary messageRepliesDict

List SomeMethodThatSendMultMessages() {
for process in processes {
messageRepliesDict.add(process.Id, someTaskTrackingObject)
sendMessage(process)
}

// Not sure if this is needed? Thinking this new method could block.
List results = getFormattedResultsFromProcessReplies()
return results
}

void sendMessage(msg) {
// Logic what to do with message
if msg.type == oneImInterestedIn {
addMessageToMessageRepliesDict(msg)
}
}

List getFormattedResultsFromProcessReplies() {
Timeout = 5000
weTimedOut = true
Time = 0
While Time < Timeout {
if Task.WhenAll(messageRepliesDict == Done) {
weTimedOut = false
break
}
}
if weTimedOut {
errorHandling
return
}
List results = collectMessagesFromDictAndFormatThem()
return results
}



Подробнее здесь: https://stackoverflow.com/questions/788 ... cation-res
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»