2016-07-14 5 views
2

Ich habe Zeitcode, der auf tote Peers überprüft. Ich benutze System.Threading.Timer, um das zu tun. Der Erkennungscode funktioniert und ich nenne es wie folgt aus:C# threading Timer muss sich selbst stoppen Async-Socket-Code

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

wo Staat ist, die stateobject und später

Socket handler = state.workSocket; 

verwendet wird ...

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

Das Verfahren selbst ist definiert als static void timedcode(StateObject state) {...}

jetzt ist das Problem, dass nach Ich erkenne, dass etwas mit dem Peer schief gelaufen ist Ich brauche den SocketKPATimer um zu stoppen und ich kann nicht. Wie muss ich Timedcode ändern, damit ich den Timer bitte anhalten kann?

Antwort

1

Eine Möglichkeit, auf die SocketKPATimer zuzugreifen, besteht darin, die Timer in die timedcode(state)-Methode im Statusobjekt zu übergeben. Das bedeutet, dass Sie eine Klasse erstellen müssen, die Eigenschaften für die Socket und eine Timer enthält. Dann können Sie zuerst die Timer definieren und dann mit einem Delegaten instanziieren und die Timer referenzieren. Dies behandelt keine Probleme mit dem Zugriff auf den 'Timer'. Sie sollten dafür typische Multithreading-Techniken verwenden.

Beispiel:

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

ja, das es in meinem Testcode tut. Ich musste 'state.TimerThingy = SocketKPATimer;' nach der Erstellung des SocketKPATimers verschieben, sonst löst der Code beim Verteilen des Timers eine Nullreferenz-Ausnahme aus. Vielen Dank. – ZoOl007