C#:手动重置事件时崩溃

C#:手动重置事件时崩溃,c#,multithreading,tcp,manualresetevent,C#,Multithreading,Tcp,Manualresetevent,我使用作为主要助手编写代码 我的代码: private ManualResetEvent _AllDone = new ManualResetEvent(false); internal void Initialize(int port,string IP) { IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port); Socket _Accpt = new Socket

我使用作为主要助手编写代码

我的代码:

    private ManualResetEvent _AllDone = new ManualResetEvent(false);

    internal void Initialize(int port,string IP)
    {
        IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port);
        Socket _Accpt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        _Accpt.Bind(_Point);
        _Accpt.Listen(2);

        while (true)
        {
            _AllDone.Reset();
            _Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
            _AllDone.WaitOne(); <<crash here
        }

    }

因此,如果我没有弄错,您希望在收到套接字连接后立即重新启动
Accept
,而不是等到
Accept
完成,这就是为什么不使用同步版本的
Accept

那么您是说当您将套接字连接到指定的地址和端口时,它不会触发Accept方法?因为Accept就是这样做的:它接受一个新的传入连接,等待客户端连接。因此,这可能就是为什么您认为它“崩溃”了,以及为什么它从未到达您的Accept方法中的代码

提示:也许还可以看看

编辑:要设置异步服务器侦听传入连接,您不需要任何ManualWaitEvent:

internal void Initialize(int port,string IP) {
    IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port);
    Socket _Accpt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    _Accpt.Bind(_Point);
    _Accpt.Listen(2);
    _Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
}

private void Accept(IAsyncResult async) {
    Socket _Accpt = (Socket)async.AsyncState;
    Socket _Handler;
    try {
        _Handler = _Accpt.EndAccept(async);
    } finally {
        _Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
    }

    StateObject _State = new StateObject();
    _State.workSocket = _Handler;

    _Handler.BeginReceive(_State.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), _State);
}

注意:您还需要一个退出条件,以便不调用BeginAccept(例如,当您想关闭服务器时)。

我想Lucero是想说,应用程序工作正常,您可能会问为什么

当您使用服务器端套接字应用程序时,基本上要做的是让服务器连接到一个端口,然后等待连接到达。当连接到达时,您将执行其余的代码

Lucero所说的是,当没有消息到达服务器时,服务器会一直保持Liseting状态并等待,这可能会让你看起来像被冻结了一样


您的代码中是否存在这种情况?

没有例外,它只是冻结(崩溃)。这是什么类型的“服务器”?一个windows服务,或者只是一个充当服务器的控制台应用程序来进行测试?这是应用程序的服务器部分。你能发布客户端部分吗?我想“崩溃”更像是死锁。你的第一句话是对的——这就是我想要的。但是,您的第二个语句是错误的。我没有使用TCP客户端连接到它。我只是调用该代码来设置服务器。那么,到目前为止,没有任何崩溃。服务器等待传入的客户端连接,并且仅在收到此连接时才会调用您的Accept方法。我想您误解了我的问题。如何使其等待而不崩溃?您写道:“没有例外,它只会冻结(崩溃)”但这正是Accept及其变体应该做的——直到客户端连接!因此,这只是正常的(等待)行为。你误解了我的问题-再一次。服务器是win32表单应用程序。我不能创建一个线程并在线程内执行吗?如果我能做到,请告诉我怎么做。
internal void Initialize(int port,string IP) {
    IPEndPoint _Point = new IPEndPoint(IPAddress.Parse(IP), port);
    Socket _Accpt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    _Accpt.Bind(_Point);
    _Accpt.Listen(2);
    _Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
}

private void Accept(IAsyncResult async) {
    Socket _Accpt = (Socket)async.AsyncState;
    Socket _Handler;
    try {
        _Handler = _Accpt.EndAccept(async);
    } finally {
        _Accpt.BeginAccept(null, 0, new AsyncCallback(Accept), _Accpt);
    }

    StateObject _State = new StateObject();
    _State.workSocket = _Handler;

    _Handler.BeginReceive(_State.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), _State);
}