在后台线程上执行异步套接字

本文关键字:异步 套接字 执行 后台 线程 | 更新日期: 2023-09-27 18:28:35

我一直在尝试实现一些套接字代码,看看它是否符合我的需求,所以请使用添加到这个问题中的示例代码@spender。

如果我在主线程上运行它,它会按预期工作,但当我在后台线程上调用它时,当客户端尝试连接时,它永远不会从睡眠中醒来,我的线程生成如下:

_Thread = new Thread(new ThreadStart(StartListening));
_Thread.Name = "ThreadForSocket";
_Thread.IsBackground = true;
_Thread.Start();

private void StartListening()
{
    new AsyncSocketListener().StartListening(InitializeEndPoint());
}
public class AsyncSocketListener : IDisposable
{
    public void StartListening(IPEndPoint endPoint)
    {
        try
        {
            var socket = new Socket(endPoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            socket.Bind(endPoint);
            socket.Listen(10);
            while (true)
            {
                string info = string.Format("{0} Waiting for a connection...", DateTime.Now.ToString("HH:mm.ss"));
                Controller.StatusSignal.Reset();
                Console.WriteLine(info);
                Debug.WriteLine(info);
                socket.BeginAccept(new     AsyncCallback(SocketListener.AcceptCallback), socket);
                Controller.StatusSignal.WaitOne();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
        Console.WriteLine("Closing the listener...");
    }

线程仍然存在于线程窗口中,并且处于预期状态,所以我不知道它为什么拒绝在客户端连接时唤醒。

这可能吗?我阅读了套接字msdn页面,它似乎建议它应该可以作为后台线程。

在后台线程上执行异步套接字

(经过过多的头发拉扯和消除过程)

代码很好,(Windows)防火墙使用后台线程阻止了二进制文件(尽管设置了,但没有通知),但允许非线程版本通过,因此我最初认为这是一个代码问题。

因此,是的,上面显示的异步模式在后台线程上运行非常好,如图所示,当然这是一种很好的使用方式,因为你只是在休眠bg线程,而你的主(例如UI)线程可以正常运行。