У меня есть следующий в методе 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();
У меня есть полный контроль над дизайном функций здесь и, возможно, это потому, что я смотрел на это весь день, но я надеясь, что кто-то сможет дать мне несколько указателей, похоже, работает, но не чувствует себя хорошо.
'ждут Task.WhenAll (tasks);' вместо Task.WaitAny. WaitAny продолжит выполнение первой задачи. –
Вы хотите использовать '_cancellationTokenSource.Cancel();' когда вам нужно заставить задачи отменять. Так что да, использование его в OnStop в порядке, чтобы прекратить изящество. –
ОК, так что звучит хорошо до сих пор, у меня также есть метод Stop на том же объекте UdpListener, который делает кучу закрытия отписки и т. Д., И мне интересно, как бы я это вызвал? –