0

У меня есть следующий в методе OnStart работника роли:Как контролировать запуск и остановку сбора коллекции задач с неблокируемой методой в Worker роли

// Loop through Port Mappings and start a listener for each mapping 

foreach (var devicePortMapping in _listenConfig.DevicePortMappingCollection) 
{ 
    Log.Information("Starting Listener for DeviceType {DeviceType} on {Port}", devicePortMapping.DeviceType,devicePortMapping.Port); 

    _workerTasks.Add(
        token => 
        { 
         return 
          Task.Run(
           () => 
           { 
            var listener = new InboundUdpListener(_container.Resolve<IMessagePublisher>(), 
             devicePortMapping.DeviceType, devicePortMapping.Port); 

            listener.Start(); 
           }, token); 
        }); 
} 

Метод запуска является недействительным и пинками из группы RX/Udp, но она не блокирует.

Я беспокоюсь о том, что должно быть в моих методах Run и OnStop, чтобы убедиться, что оно продолжает работать и что оно закрыто.

В структуре консолидации упомянутых здесь https://msdn.microsoft.com/en-gb/library/dn589778.aspx это предлагает использовать:

try 
{ 
    Task.WaitAny(tasks.ToArray()); 
} 
catch (AggregateException ex) 
{ 
    Trace.TraceError(ex.Message); 

    // If any of the inner exceptions in the aggregate exception 
    // are not cancellation exceptions then re-throw the exception. 
    ex.Handle(innerEx => (innerEx is OperationCanceledException)); 
} 

Но, конечно, это не будет работать, как мои задачи будет полным, как listener.start не блокирует?

В OnStop метода является то, что достаточно просто использовать:

_cancellationTokenSource.Cancel(); 

У меня есть полный контроль над дизайном функций здесь и, возможно, это потому, что я смотрел на это весь день, но я надеясь, что кто-то сможет дать мне несколько указателей, похоже, работает, но не чувствует себя хорошо.

+0

'ждут Task.WhenAll (tasks);' вместо Task.WaitAny. WaitAny продолжит выполнение первой задачи. –

+0

Вы хотите использовать '_cancellationTokenSource.Cancel();' когда вам нужно заставить задачи отменять. Так что да, использование его в OnStop в порядке, чтобы прекратить изящество. –

+0

ОК, так что звучит хорошо до сих пор, у меня также есть метод Stop на том же объекте UdpListener, который делает кучу закрытия отписки и т. Д., И мне интересно, как бы я это вызвал? –

ответ

0

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

Всякий раз, когда я думаю, возможно, хватит на RX/Tasks/Async/Await что-то появляется, что демонстрирует, что у меня все еще есть способы пойти.