2016-07-14 18 views
2

我有定時代碼檢查死對等。我使用System.Threading.Timer來做到這一點。檢測代碼的工作,我這樣稱呼它:c#線程計時器需要停止自己的異步套接字代碼

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

其中狀態是所使用到

Socket handler = state.workSocket; 

,後來成爲StateObject ...

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

的方法本身被定義作爲 static void timedcode(StateObject state) {...}

現在的問題是,在我發現對端出現問題,我需要SocketKPATimer停止,而我不能。 如何修改時間碼,以便我可以停止計時器?

回答

1

您將要訪問SocketKPATimer的一種方法是將Timer傳遞給狀態對象中的timedcode(state)方法。這意味着您將不得不創建一個包含SocketTimer屬性的類。然後,您可以先定義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。在創建SocketKPATimer之後,我確實需要移動'state.TimerThingy = SocketKPATimer;'否則代碼在拋棄定時器時拋出nullreference異常。非常感謝你。 – ZoOl007