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

时间:2016-01-01 12:01:37

标签: c# sockets asynchronous

我一直在玩实现一些套接字代码,看它是否符合我的需求,所以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...");
    }

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

这可能吗?我读了socket msdn页面,似乎表明它应该适用于后台线程。

1 个答案:

答案 0 :(得分:0)

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

代码没问题,(Windows)防火墙已经使用后台线程阻止了二进制文件(尽管没有通知,但没有通知)但是允许通过非线程版本,因此我原本认为这是代码问题。 / p>

所以,是的,上面显示的异步模式完全可以在后台线程上运行,如图所示,当然它是一个很好的使用它的方式,因为你只是在睡觉bg线程和你的主要(例如UI)线程可以正常运行。