Асинхронный метод запускает AsyncCallback в текущем потоке

222
14 октября 2017, 16:49

Имеется сервер класса TcpListener. Он принимает входящие подключения методом BeginAcceptTcpClient (AsyncCallback, Object).

Код написан на основе примера с MSDN.

public static ManualResetEvent tcpClientConnected = 
    new ManualResetEvent(false);
public static void DoBeginAcceptTcpClient(TcpListener 
    listener)
{
    while(true)
    {
        tcpClientConnected.Reset();
        Console.WriteLine("Waiting for a connection...");
        listener.BeginAcceptTcpClient(
            new AsyncCallback(DoAcceptTcpClientCallback), 
            listener);
        tcpClientConnected.WaitOne();
    }
}
public static void DoAcceptTcpClientCallback(IAsyncResult ar) 
{
    TcpListener listener = (TcpListener) ar.AsyncState;
    TcpClient client = listener.EndAcceptTcpClient(ar);
    Console.WriteLine("Client connected completed");
    tcpClientConnected.Set();
    while(thue)
    {
         //Прием сообщений от клиента
    }
}

Проблема заключается в том, что метод DoAcceptTcpClientCallback(IAsyncResult ar) иногда начинает выполняться в текущем потоке, а не во вновь созданном как это обычно бывает, и тем самым блокирует его и из-за чего прием следующих подключений невозможен. Закономерность и причины проследить не удалось. В чем может быть дело?

READ ALSO
Чтение данных из excel

Чтение данных из excel

Нашёл на просторах StackOverflow пример как читать данные из excelНо вылетают ошибки

174
Аналог Padding в RichTextBox

Аналог Padding в RichTextBox

Когда задан Padding для параграфа, то его формат передается следующей строке, после нажатия EnterИ убрать его получается только вручную

245
Что означает оператор << в C#? [дубликат]

Что означает оператор << в C#? [дубликат]

На данный вопрос уже ответили:

296
Кодировка массива object в base64

Кодировка массива object в base64

Есть консольная программа, код:

211