【问题标题】:Threading and Sockets线程和套接字
【发布时间】:2009-11-17 17:14:58
【问题描述】:

我有以下几点:

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

mySocket 现在在 Listen() 上循环,此时我:

new Thread(startThread).Start();

这里是开始监听:

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 类似吗?

【问题讨论】:

    标签: c# sockets multithreading begininvoke


    【解决方案1】:

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

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

    最后,您正在使用的 locker 对象实际上并没有做任何事情,因为它是 StartListen() 方法的本地对象。为了使同步对象产生任何效果,它们需要可供需要对共享数据进行序列化访问的线程访问。你在这里做的方式,其他线程无法访问locker变量,从而使其无用。

    【讨论】:

    • 我以前没用过'volatile'。我会仔细阅读它。使用 TcpListener 并非完全不可能。但是,我已经编写了所有异步操作并使用了 Sockets 类。我选择使用基类,而不是在 TcpListener/TcpClient 上采取简单的方法。 :)
    • 使用Socket类没有错。只是TcpListener 更容易,因为它专为您如何使用Socket 而设计。
    猜你喜欢
    • 2019-04-24
    • 2011-02-11
    • 2013-04-02
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多