Observable.FromAsyncPattern & UdpClient C # - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу иметь возможность использовать реактив для асинхронного получения пакетов udp.я написал этот блок кода.

udpServer = new UdpClient(20000);
remoteEP = new IPEndPoint(IPAddress.Any, 20000);

var read = Observable.FromAsyncPattern(udpServer.BeginReceive, t => udpServer.EndReceive(t, ref remoteEP));

, затем я использую эту функцию и сохраняю результирующий IObservable.

reader = read()
       .Do(s =>
       {
           Logs.Add(System.Text.Encoding.UTF8.GetString(s));
       })
       .DoOnError(ex => status = ex.Message; );

когда я наконец подписываюсь, операция происходит только один раз, тогда наблюдательзавершается.

и вот мой вопрос : есть ли способ заставить этот код работать непрерывно?получать операцию «DO» каждый раз, когда поступают новые журналы?

боковая панель: просто интересно, в чем смысл с Observable.FromAsyncPattern, если я не могу использовать его повторно, мне лучше статически печатать 2 метода для начала иend вместо получения дополнительной информации о большем количестве экземпляров классов, которые позже необходимо удалить.

-im также открыт для всех других опций, кроме использования TPL.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Попробуйте:

var query =
    Observable
        .Using(
            () => new UdpClient(new IPEndPoint(IPAddress.Any, 20000)),
            udpServer =>
                Observable
                    .Defer(() =>
                        Observable
                            .FromAsync(() => udpServer.ReceiveAsync()))
                    .Repeat());

Вам необходимо управлять IDispose ресурсами, используя .Using, и вам нужно .Repeat позвонить на FromAsync.

. FromAsyncPattern устарел.


Если вам нужно использовать устаревший FromAsyncPattern, сделайте следующее:

var query =
    Observable
        .Using(
            () => new UdpClient(20000),
            udpServer =>
                Observable
                    .Defer(() =>
                        Observable
                            .FromAsyncPattern(udpServer.BeginReceive, t => udpServer.EndReceive(t, ref remoteEP)))
                    .Repeat());
0 голосов
/ 26 апреля 2018

Это потому, что наблюдатели работают над данной коллекцией.Коллекция, возвращенная из BeginReceive, отличается от повторного вызова.С кодом, который вы показали, я не удивлен, что он работает только один раз.Вам необходимо обеспечить согласованный буфер для BeginReceive и затем подписывать наблюдателя на этот буфер для его запуска каждый раз.То есть буфер должен быть одним и тем же экземпляром между вызовами.

...