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

Posted

技术标签:

【中文标题】在后台线程上执行异步套接字【英文标题】:Executing an asynchronous socket on a background thread 【发布时间】:2016-04-05 23:41:01 【问题描述】:

我一直在尝试实现一些套接字代码,看看它是否符合我的需求,所以use the sample code @spender kindly added to this question。

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

_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 页面,它似乎表明它应该可以用于后台线程。

【问题讨论】:

您需要添加更多代码来显示如何重现问题。 实际的套接字代码直接链接到上面。 'StartListening' 上面的委托仅调用此代码:***.com/a/12631467/181221 代码必须在问题本身中,而不是在指向其他网站的链接或本网站上的其他问题中。另一个问题中也没有 StartListening 方法,你至少应该把那个方法放进去。 直接添加代码而不是感谢链接,谢谢 【参考方案1】:

(经过过多的拔毛和消除的过程)

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

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

【讨论】:

以上是关于在后台线程上执行异步套接字的主要内容,如果未能解决你的问题,请参考以下文章

在异步后台线程上运行 CADisplayLink 的正确方法?

块在异步线程上执行两次

将代码执行移至后台线程的阈值是多少? [关闭]

Java中的异步IO?

IASyncResult接口实现简单异步编程(C#)

C#如何在BackgroundWorker 后台线程中使用定时器?