8

私は単純な非同期TCPサーバーを作成しました-それはうまく機能します。しかし、今度は、受信したデータをConsole-Testprogramに出力したいと思います。そして問題は、これが機能していないということです!MainThreadをEventHandlerに接続すると、プログラムは何もしません。デバッグは、sc05Server_DataAvailableが呼び出されたことを示していますが、何も起こりませんでした。プログラムはまだ応答しています。

ここにコード:

private void ReadCallback(IAsyncResult asyncResult)
{
    Sc05BdClient sc05BdClient = asyncResult.AsyncState as Sc05BdClient;
    if (sc05BdClient == null) return;
    NetworkStream networkStream = sc05BdClient.NetworkStream;
    int read = networkStream.EndRead(asyncResult);

    if (read == 0)
    {
        lock (clients)
        {
            clients.Remove(sc05BdClient);
            return;
        }
    }

    string data = Encoding.GetString(sc05BdClient.Buffer, 0, read);
    System.Diagnostics.Debug.Print(data);
    OnDataAvailable(this, new DataAvailableEventArgs(data));  <---- here Handler is called
    networkStream.BeginRead(sc05BdClient.Buffer, 0, sc05BdClient.Buffer.Length, ReadCallback, sc05BdClient);
}


public event EventHandler<DataAvailableEventArgs> DataAvailable;

protected virtual void OnDataAvailable(object sender, DataAvailableEventArgs e)
{
    EventHandler<DataAvailableEventArgs> handler = DataAvailable;
    if (handler != null)
        handler(sender, e);
}


public class DataAvailableEventArgs : EventArgs
{
    public string Data;

    public DataAvailableEventArgs(string data)
    {
        Data = data;
    }
}

メインプログラム:

class Program
{
    static void Main()
    {
        Sc05BdServer sc05BdServer = new Sc05BdServer(IPAddress.Any, 2006);
        sc05BdServer.DataAvailable += sc05BdServer_DataAvailable;
        sc05BdServer.Start();

        Console.ReadKey();
        sc05BdServer.Stop();
    }

    static void sc05BdServer_DataAvailable(object sender, DataAvailableEventArgs e)
    {
       Console.WriteLine(e.Data);  <--- this is called once
    }
}

私はそれがスレッディングと関係があると思います-しかし私はそれらをどのように扱うのか分かりません。

4

1 に答える 1

3

Consoleはそれを免れるはずですが、おそらく何らかのレースの問題が発生しています。この質問を確認してください。ただし、問題を再現できなかったことに注意してください。マルチスレッドを使用したConsole.ReadKey()の奇妙な動作

于 2013-03-06T09:00:23.877 に答える