Как слушать сокет как IEnumerable? - PullRequest
0 голосов
/ 14 марта 2019

В следующем коде я могу подписаться на сокет и получать сообщения. Сообщения принимаются в какой-то ветке ввода-вывода.

var subscription = SubscribeToStreamAsync( msg => { } ).Result;
...
Unsubscribe( subscription );

Я хочу прослушать эти сообщения в обычном цикле foreach. Итак, мне нужно направить сообщения в моей ветке и вернуть поток как IEnumerable.

foreach(var item in GetStreamAsync().Result) {
    if (item == ...) break;
}

Могу ли я сделать это через System.Collections.Concurrent?

И я не хочу использовать System.Reactive.

1 Ответ

0 голосов
/ 15 марта 2019

Я сделал следующим образом.

Только я боюсь, что поток зависнет, если возникнут какие-либо проблемы с сокетом / сервером.

var collection = new BlockingCollection<object>();
var subscription = SubscribeToStreamAsync().Result;
try {
    var enumerable = collection.GetConsumingEnumerable();
    foreach (var item in enumerable) {
        yield return item;
    }
} finally {
    // foreach or stream is completed
    Unsubscribe( subscription ).Wait();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...