2017-01-02 10 views
0

私はWindows AzureでホストしているWCFサービスを持っています。このサーバーではタイマーを使用し、サーバーは何かを更新する必要があります。サーバーは、ASPアプリケーションとWPFアプリケーションで実装されています。WCFサーバーのタイマーは毎回複製されます

私はこのようなコンストラクタでタイマーを初期化する場合:

public Service1() 
{ 
    System.Timers.Timer timer = new System.Timers.Timer(); 
    timer.Elapsed += new System.Timers.ElapsedEventHandler(WCFService_Elapsed); 
    timer.Interval = 10000; 
    timer.Enabled = true; 
    timer.Start(); 
} 

タイマーが開始されますが、私はアプリケーションを再起動した場合(これはタイマーの複製を実行するため)タイマーは、より速く実行されます。プライベートプロパティはトリックをしないので、コンストラクタの上にタイマーを宣言します。

私はすでにServiceBaseクラスからのOnStartメソッドでそれを使用しようとした:

private System.Timers.Timer timer; 
    protected override void OnStart(string[] args) 
    { 
     timer = new System.Timers.Timer(); 
     timer.Elapsed += new System.Timers.ElapsedEventHandler(WCFService_Elapsed); 
     timer.Interval = 10000; 
     timer.Enabled = true; 
     timer.Start(); 
    } 

しかし、これが呼び出されることはありません取得...私はまた、静的なタイマーをテストしたが、それはどちらか開始されません。

私は間違っていますか?

+0

WCFサービスは、「命」は、それが一度呼び出され、その後再び呼び出されるまで破棄されるものではありません。タイマーを置くのは本当に悪い場所です。定義すると、長い間生きている必要があります。あなたのサービスコードは私のWindowsサービスのように見えます。このコードが何で、どこに行くのか説明できますか? – nvoigt

+0

WCFサービスに似た何かをアクティブにしておき、タイマーごとに機能する機能が必要な場合は、Windowsサービスを使用してみませんか? 短いチュートリアルです:https://msdn.microsoft.com/en-us/library/zt39148a(v=vs.110).aspx#Anchor_0 –

+0

@nvoigtこれは学校プロジェクトです、それはWCFサービスである必要がありますそれはすべての論理がWCFサービスに入っています。 ASPとWPFのアプリケーションは、tamagotchiを表示し、食べ物などを与えるだけです.WCFService_Elapsedメソッドは、データベース内の10秒ごとに統計をランダム化します。このため、タマゴチチスは死ぬ可能性があり、あなたはそれらとやりとりする必要があります。 – Ferryzijl

答えて

0

タイマーはIDisposableを継承しています。つまり、タイマーは処分できます。

サービスを閉じるときに、タイマーはまだ動作していますが、サービスを停止して問題を解決する必要があることに驚いています。

は、だからあなたのOnStopメソッドであなたが呼び出す必要があります:

timer.Stop(); 
timer.Dispose(); 
+0

何らかの理由でOnStopを呼び出さないと、Service1クラスをIDisposableから継承し、timer.Stop )とtimer.Dispose();あなたの廃棄方法で。 – KoPoCabana

+0

Onstopメソッドは動作しません。これは、標準ではServiceBaseを実装していないWCFアプリケーションであるためです。 Idisposableから継承すると、私はStackOverflowExceptionを受け取ります。 – Ferryzijl

関連する問題