2016-07-28 13 views
1

ステートフルサービスのRunAsyncメソッドで多数のサービスバスクライアントを作成しています。RunAsyncのタイムアウトを増やす

このメソッドは、開発環境で実行しているときにアプリケーションが起動できない場合に許可される4秒より長くかかります。

私の開発マシンとAzureの間に待ち時間があると思われるため、失敗します。

私はタイにいます。 Azureは米国中南部にあります。

私の開発ボックスで4000ミリ秒のタイムアウトをローカルに増やすことはできますか?

私が手にエラーがある:

{ 
{ 

    "Message": "RunAsync has been cancelled for a stateful service replica. The cancellation will be considered 'slow' if RunAsync does not halt execution within 4000 milliseconds.   
    "Level": "Informational", 
    "Keywords": "0x0000F00000000000", 
    "EventName": "StatefulRunAsyncCancellation", 
    "Payload": { 
[...] 
"slowCancellationTimeMillis": 4000.0 

} }

+0

いくつかのコードとエラーメッセージを表示できますか?私の知る限り、タイムアウトはありません。サービスインスタンス/レプリケートがプライマリである限り、RunAsyncは継続的に実行できます。遅い取り消し警告がありますが、サービスが役割を変更したり削除されたりすると、それだけで正常性レポートが生成されます。 –

+0

それは私が得る遅い警告です。私は詳細を書いて私の投稿を編集しました。もちろん、この非常に瞬間、アプリケーションはコードを変更することなく正常に終了しました。 –

+0

私はこの警告を無視することができると思います。とにかくそのタイムアウトを変更する方法はありません(ハードコードされています)。 –

答えて

4

問題は、それが長すぎるをキャンセルするのにかかることだ、そのRunAsyncの実行に時間がかかりすぎるではありません。

サービスファブリックには、レポート「遅い」キャンセルの場合、デフォルトの(ハードコードされた)タイムアウトが4秒あります。つまり、その時間が過ぎると、健康イベントが発生します(アプリケーション全体の健康状態に影響を与えるため、アップグレード中に重要になる可能性があります)。

実際の問題はRunAsyncの実装です。サービスを削除したり、サービスファブリックをアップグレードすると、サービスファブリックは正常にシャットダウンするまで(潜在的に永遠に)待機します。あなたのコードは、RunAsyncメソッドに渡されたCancellationTokenを尊重する必要があります。たとえば、複数のIO操作がある場合は、それぞれの操作の後で(可能な場合はいつでも)cancellationToken.ThrowIfCancellationRequested()を呼び出し、それをパラメータとして受け取るメソッドに渡します。

+0

ありがとうございました。私はコードのその部分を見直します。 –

+0

@EliはService Fabricにサービスを停止させる方法はありますか?その作業は安全で「無意識のうちに」行われるので、いつでも悲しみ(または健康イベント)なしで殺すことができます – Iain

+0

@I私が知っている唯一の方法は、サービスを削除することです(PowerShellなど)。 –

関連する問題