【发布时间】:2023-04-05 02:40: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' 上面的委托仅调用此代码:stackoverflow.com/a/12631467/181221
-
代码必须在问题本身中,而不是在指向其他网站的链接或本网站上的其他问题中。另一个问题中也没有 StartListening 方法,你至少应该把那个方法放进去。
-
直接添加代码而不是感谢链接,谢谢
标签: c# sockets asynchronous