全て、
既存のワーカー ロール コードを Azure Web ジョブに移行しています。Azure Web サイトと完全に統合するために、WebJob SDK (1.0) を使用しようとしています。
難しいのは、JobHost が、通常の属性ベースの呼び出しオプション (キュー、ブロブなど) の外にあるジョブでうまく動作しないことです。
Azure キュー/トピックなどをリッスンするように変更できない標準コードが既にあるため、Web ジョブ コードを使用してこれを行うことはできません。
したがって、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:ライブラリを使用するときにすべてのアドバイスはConfigureAwait(false)を使用することですが、JobHostの内部ではこれを行わないため、独自のCallAsyncを使用していますが、ConfigureAwaitを使用して「呼び出し」コードを複製しています。私が知る限り、キャンセル トークンは JobHost では何もしません。
私の問題は、次に host.RunAndBlock(); を呼び出す必要があることです。これは問題ありませんが、クリーンアップ処理を実行する必要があります。ホストが既にキャンセルされているため、OnStop メソッドを使用して "CallAsync" を新たに呼び出すことはできません。そのため、できることは OnStop メソッドを直接呼び出すことだけです。残念ながら、提供された TextWriter クラスを介して WebSite ログに書き込むことができなくなります。
私が必要としているのは、JobHost が RunAndBlock 内でメソッドを呼び出す方法だと思います。そのため、ホストがシャットダウンしているときに発行されたキャンセル トークンを取得して、クリーンアップ コードを実行できます....しかし、ないようですこれを行う方法。
私が行方不明になっている明らかな方法はありますか?JobHost は、標準外のシナリオを処理するのが本当に苦手なようです :(