2016-07-14 7 views
2

死んだピアをチェックするタイムコードがあります。私はそれを行うSystem.Threading.Timerを使用します。検出コードの作品と私はこのようにそれを呼び出す:状態はメソッド自体C#threadingタイマーは、非同期ソケットコードを停止する必要があります

Socket handler = state.workSocket; 

以降...

handler.Shutdown(SocketShutdown.Both); 
//I need to stop the Timer here 

に使われているStateObjectですが定義されている

Timer SocketKPATimer = new Timer(delegate { timedcode(state); }, null, 5000, 5000); 

as static void timedcode(StateObject state) {...}

ここで問題は私は何かが間違っていることを検出します。私はSocketKPATimerを停止する必要があります。私はできません。 タイムコードを変更する必要がありますので、タイマーを止めることができますか?

答えて

1

SocketKPATimerにアクセスする方法の1つは、Timerを状態オブジェクトのtimedcode(state)メソッドに渡すことです。つまり、SocketTimerのプロパティを含むクラスを作成する必要があります。次に、最初にTimerを定義し、それをデリゲートでインスタンス化し、Timerを参照します。これは、 'Timer'にアクセスする際の並行性の問題を一切処理しません。そのためには、一般的なマルチスレッド技術を使用する必要があります。

例:

class State 
{ 
    public Socket WorkSocket { get; set; } 
    public System.Threading.Timer TimerThingy { get; set; } 
} 

private void Nothing() 
{ 
    Socket someSocket = null; 
    System.Threading.Timer socketKPATimer = null; 

    State state = new State(); 

    state.WorkSocket = someSocket; 
    state.TimerThingy = socketKPATimer; 

    socketKPATimer = new System.Threading.Timer(delegate { timedcode(state); }, null, 5000, 5000); 
} 

private void timedcode(object state) 
{ 
    var s = state as State; 
    Socket hander = s.WorkSocket; 
    System.Threading.Timer timer = s.TimerThingy; 
    hander.Shutdown(SocketShutdown.Both); 
} 
+0

はい、私のtestcodeでそれをしないこと。私は 'state.TimerThingy = SocketKPATimer;'をSocketKPATimerの作成後に移動しなければならなかった。さもなければ、コードはTimerの廃棄時にnull参照例外をスローする。どうもありがとうございました。 – ZoOl007

関連する問題