c#threading Timer需要自己停止异步套接字代码

时间:2016-07-14 15:36:43

标签: c# asynchronous timer

我有定时检查死对等的代码。我使用System.Threading.Timer来做到这一点。检测代码有效,我称之为:

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

其中state是用于

的StateObject
Socket handler = state.workSocket;

以后......

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

方法本身定义为     static void timedcode(StateObject state) {...}

现在的问题是,在我发现对等方出现问题后,我需要停止SocketKPATimer而不能。 我如何修改timedcode以便我可以停止计时器?

1 个答案:

答案 0 :(得分:1)

您要访问SocketKPATimer的一种方法是将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);
}