gpt4 book ai didi

c# - 线程和 socket

转载 作者:行者123 更新时间:2023-12-03 12:01:45 24 4
gpt4 key购买 nike

我有以下几点:

   ThreadStart startThread =
delegate
{
mySocket.StartListen();
};

当我:
new Thread(startThread).Start();

这是StartListen:
public void StartListen()
{
Object locker = new Object();

// Lock resources
lock (locker)
{
S = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork,
System.Net.Sockets.SocketType.Stream,
System.Net.Sockets.ProtocolType.Tcp);
S.Blocking = false;

try
{
S.Bind(serverEP);
S.Listen(1000);
isListening = true;

/*
* While statement not required here because AcceptConnection()
* method instructs the socket to BeginAccept() again...
*/
//while (true)
//{
connectDone.Reset();
S.BeginAccept(new AsyncCallback(AcceptConnection), Channel);
connectDone.WaitOne();
//}
}
catch (System.Net.Sockets.SocketException SockEx)
{
Console.WriteLine("*****[" + name + "] " + SockEx.SocketErrorCode + ":");
Console.WriteLine("*****[" + name + "] " + SockEx.Message);
}
}
}

由于采用了异步方法,因此事情并没有真正“完成”,也没有返回信号让其他任何事情继续进行。我在上述Thread.Start()之后实现的所有命令均无法正常工作。例如,在StartListen中,请注意我有一个 isListening = true。启动线程后,我想使用属性IsListening。它总是返回为false。

我应该如何启动线程。首选异步方法(即ThreadStart.BeginInvoke())吗?这与使用ManualResetEvent相似吗?

最佳答案

isListening标记为 volatile 。据我了解,您在两个不同的线程中引用此标志。通常,线程之间共享的数据必须同步,但您似乎并没有这样做。但是,鉴于该标志是bool类型的,因此从技术上讲,您不必同步对其的访问,因为.NET框架保证从bool类型进行的读取和写入是原子的(我想我说的是正确的……有人如果在技术上不正确,请纠正我)。但是,为了确保从该类型读取的值实际上获得了最新值,您需要将其标记为volatile

另外,最好使用TcpListener类,而不要尝试使用Socket类。您的操作没有错,但是TcpListener类会使IMO的代码更易于阅读和维护。

最后,您正在使用的locker对象实际上并没有做任何事情,因为它是StartListen()方法的本地对象。为了使同步对象发挥作用,需要对共享数据进行序列化访问的线程必须可以访问它们。您在此处执行此操作的方式是,其他线程无法访问locker变量,因此使其无用。

关于c# - 线程和 socket ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1750360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com