1

私は次のものを持っています:

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

次の場合、mySocket は Listen() でループするようになりました。

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 を使用するのと似ていませんか?

4

1 に答える 1

2

としてマークisListeningvolatileます。私が理解しているように、あなたは2つの異なるスレッドでこのフラグを参照しています。通常、スレッド間で共有されるデータは同期する必要がありますが、同期しているようには見えません。ただし、フラグがブール型であることを考えると、.NET Frameworkはブール型からの読み取りと書き込みがアトミックであることを保証するため、技術的にはフラグへのアクセスを同期する必要はありません(私はそれを正しく言っていると思います...誰か技術的に正しくない場合は修正してください)。ただし、そのタイプからの読み取りが実際に最新の値を取得することを確認するには、それをとしてマークする必要がありますvolatile

また、TcpListenerクラスでこれを実行しようとするのではなく、クラスを使用する方がよいでしょうSocket。あなたがしていることは間違っていませんが、TcpListenerクラスはあなたのコードを読みやすく、維持しやすくします、IMO。

最後に、使用しているlockerオブジェクトはメソッドに対してローカルであるため、実際には何もしませんStartListen()。同期オブジェクトを有効にするには、共有データへのシリアル化されたアクセスを必要とするスレッドが同期オブジェクトにアクセスできる必要があります。ここで行っている方法では、他のスレッドがlocker変数にアクセスできないため、変数が役に立たなくなります。

于 2009-11-17T17:59:15.267 に答える