0

非同期ソケットを使用して複数のクライアント サーバーを作成しました。特定のコード サーバー gui が原因で、GUI を起動するたびに問題が発生します。以下は私のコードです

static Socket serverSocket;
static byte[] buffer = new Byte[1024];
public static ManualResetEvent allDone = new ManualResetEvent(false);
private static void StartServer()
{
    byte[] bytes = new Byte[1024];
    IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
    IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8001);

        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        serverSocket.Bind(localEndPoint);
        serverSocket.Listen(100);
        serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);

        while (true)
        {
            // Set the event to nonsignaled state.
            allDone.Reset();

            // Start an asynchronous socket to listen for.
            Console.WriteLine("Waiting for a connection...");
            serverSocket.BeginAccept(
               new AsyncCallback(AcceptCallback),
                serverSocket);

            // Wait until a connection is made before tinuing.
            allDone.WaitOne();
        }


}


private static void AcceptCallback(IAsyncResult ar)
{
    allDone.Set();
    try
    {
        Socket clientSocket = serverSocket.EndAccept(ar);

        //var buffer1 = new byte[1024];
        clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), clientSocket);
        serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);

    }
    catch (Exception ex)
    {

    }
}


private static void ReceiveCallback(IAsyncResult ar)
{
    try
    {
        int received = 0;
        Socket current = (Socket)ar.AsyncState;
        Console.WriteLine("connected : " + current.RemoteEndPoint.ToString());
        received = current.EndReceive(ar);
        byte[] data = new byte[received];

        if (received == 0)
        {
            return;
        }

        Array.Copy(buffer, data, received);
        string text = Encoding.ASCII.GetString(data);
        Console.WriteLine(text);
        Send(current, "hello");
       /// AppendToTextBox(text);
        buffer = null;
        Array.Resize(ref buffer, current.ReceiveBufferSize);

        current.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), current);
    }
    catch (Exception ex)
    {

    }
}


        }

StartServer プロセスを呼び出す gui のボタンをクリックするたびに、while(true){} 部分が原因で gui がハングします。コンソールのコードは正常に動作します。これを回避する解決策は何ですか?

4

1 に答える 1

1

そうしないと、GUI スレッドは無限while ループが終了するまで待機する必要があります。次のスレッドが必要なものでない場合は、ブレーク機能を追加することを検討してください。

 using System.Threading;

 Thread th = new Thread(new ThreadStart(delegate
 {
  //while loop
 }));
 th.Start();
于 2013-08-31T12:42:32.463 に答える