1

私はWCFを初めて使用するので、これは別の方法で行うのが最適な方法かもしれません。

現在、WCFサービスのコレクションがありますが、毎週電子メールを送信する機能を組み込みたいと思っています。これを行うために、次のコードを使用して別のWCFサービスを構築しました。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, AutomaticSessionShutdown = false)]
public class TimerService : ITimerService
{
    private static Timer timer;
    private static TimeSpan tSpan = new TimeSpan(0, 0, 20, 0);
    private static OtherService Ref = new OtherService();

    public void ToggleEmailTimer(bool enabled)
    {
        if (enabled)
            timer = new Timer(new TimerCallback(TimerElapsed), null, tSpan, tSpan);
        else
        {   
            if(timer != null)
                timer.Dispose();
        }
    }

    private void TimerElapsed(object state)
    {
        Ref.SendWeekly();
    }
}

無効になり始め、aspxページから有効にします。テストのために、これを10分間隔で動作させることができましたが、間隔を15分に設定するとどこかで壊れているようです。

私には、WCF Serivceセッションが非アクティブから期限切れになっているように見えます。これは、タイマーがちょうど停止する理由を説明します。aspxページからタイマーを有効にして終了し、タイマーサービスが持続するように、WCFサービスの有効期間を指定する方法はありますか?タイムアウト値の設定に関する情報を見てきましたが、これが当てはまるかどうかはまだわかりません。

4

2 に答える 2

1

その他は、実際のタスクのスケジューリングにWCFを使用したくないということは正しいです。アプリプールのリサイクルをいじることは理論的には可能ですが、それは間違いなく理想的なルートではありません。Windowsのタスクスケジューリングを使用することは、優れたソリューションです。これを実現する最も簡単な方法は、RESTを介してWCFサービスを公開することです(.svcファイルでFactory = "System.ServiceModel.Activation.WebServiceHostFactory"を使用します)。これにより、Windowsタスクスケジューリングでサービスにアクセスしてサービスを呼び出すことができます。 URL。

于 2010-07-28T22:19:23.350 に答える
0

これは、WCFインスタンスのコンテキストの動作ではなく、ホストプロセスに関係している可能性があります。「単一」インスタンスコンテキストは、ホストプロセスが許可する限り存続する必要があります。ただし、IISはデフォルトで、さまざまな条件でワーカープロセスをリサイクルします。これらの条件には、正常なプロセスの最大存続期間が含まれる場合がありますが、メモリフットプリントと正常性チェック中の遅延により、IISがプロセスを強制終了する可能性もあります。

IIS構成で遊んだり、長時間実行する予定のカスタムホストプロセスを作成したりすることはできますが、これはWCFにとってはまったく良いシナリオではありません。

標準のWindowsサービスプロセスでさえ、毎週実行されることになっているものにはやり過ぎのようです。Windowsタスクスケジューラを使用してタスクをスケジュールしないのはなぜですか?長期にわたるワークフローの一部である場合は、WindowsWorkflowFoundationの調査を検討する必要があります。

于 2010-07-28T02:21:07.750 に答える