2016-07-14 7 views
2

У меня есть код времени, который проверяет мертвые сверстники. Я использую System.Threading.Timer для этого. Код обнаружения работает, и я называю это так:C# threading Таймер должен остановить сам асинхронный код сокета

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

, где государство является StateObject, который используется для

Socket handler = state.workSocket; 

и позже ...

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

сам метод определен как static void timedcode(StateObject state) {...}

проблема в том, что после того, как я откладываю ct, что что-то пошло не так с сверстником, мне нужно, чтобы SocketKPATimer остановился, и я не могу. Как мне изменить временный код, чтобы я мог остановить таймер?

ответ

1

Один из способов получить доступ к SocketKPATimer - это передать Timer в метод timedcode(state) в объекте состояния. Это означает, что вам нужно будет создать класс, содержащий свойства для Socket и 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, иначе код выдает исключение nullreference при Disposing Timer. Большое спасибо. – ZoOl007

Смежные вопросы