Все,
Я переношу существующий код рабочей роли в веб-задание Azure. Я пытаюсь использовать SDK WebJob (1.0), чтобы обеспечить полную интеграцию с веб-сайтом Azure.
Сложно то, что JobHost плохо работает с заданиями, выходящими за рамки обычных параметров вызова на основе атрибутов (очереди, большие двоичные объекты и т. Д.)
У меня уже есть стандартный код, который я не могу изменить для прослушивания очередей / тем Azure и т. Д., Поэтому я не могу использовать код WebJob для этого.
Поэтому мне нужно использовать метод WebJob Call:
var cancelTokenSource = new CancellationTokenSource();
var onStartMethod = typeof(Program).GetMethod("OnStart", BindingFlags.Static | BindingFlags.Public);
host.CallAsync(onStartMethod, cancelTokenSource.Token)
.ConfigureAwait(false)
.GetAwaiter()
.GetResult();
NB: Я использую свой собственный CallAsync, так как все рекомендации заключаются в использовании ConfigureAwait (false) при использовании библиотек, но внутренности JobHost этого не делают, поэтому я сам реплицирую этот код «вызова», но с ConfigureAwait. Насколько я могу судить, токен отмены ничего не делает в JobHost.
Моя проблема в том, что мне нужно вызвать host.RunAndBlock (); чтобы остановить выполнение задания, и это нормально, но затем мне нужно выполнить некоторую очистку. Я не могу сделать новый вызов CallAsync с помощью метода OnStop, так как Host уже отменяется, поэтому все, что я могу сделать, это сделать прямой вызов моего метода OnStop. К сожалению, тогда я теряю возможность писать в журнал веб-сайта через предоставленный класс TextWriter.
Я думаю, что мне нужно, чтобы JobHost мог вызвать мой метод в RunAndBlock, чтобы затем я мог забрать токен отмены, срабатывающий при выключении хоста, а затем выполнить свой код очистки .... но похоже, что это не так. любым способом сделать это.
Есть ли очевидный способ, которым я упускаю? JobHost действительно плохо справляется со сценариями, выходящими за рамки нормы :(