通知套接字线程中已更改的变量

时间:2013-08-08 15:44:08

标签: c# multithreading sockets thread-safety unity3d

我有Unity app作为套接字服务器:

public class Server : MonoBehaviour
{
    private String outData;
    private String inData;

    public void writeData(String data){
        outData = data;
    }

    void Start()
    {       
        ThreadStart ts = new ThreadStart(dataHandler);
        mThread = new Thread(ts);
        mThread.Start();
    }

    void dataHandler()
    {
        TcpListener listener = new TcpListener(PORT);
        listener.Start();

        while (true)
        {
            var client = listener.AcceptTcpClient();
            new Thread(() =>
            {
                using (client)
                {
                    var reader = new StreamReader(client.GetStream());
                    var writer = new StreamWriter(client.GetStream());
                    while (true)
                    {
                        inData = reader.ReadLine();

                        if(outData != null){
                            writer.WriteLine(outData);
                            writer.Flush();
                            outData = null;
                        }
                    }
                }
            }).Start();
        }
    }
}

我不熟悉.NET线程,也无法弄清楚如何发送数据。当数据出现时,套接字线程唤醒并且inData字段更新。但是当我调用writeData时没有任何反应。套接字线程继续睡眠,直到inData更新。

1 个答案:

答案 0 :(得分:1)

  
    

但是当我调用writeData时没有任何反应。套接字线程继续睡眠,直到inData更新。

  

那是因为你的帖子在inData = reader.ReadLine();上被阻止了。它将一直坐在那里直到它接收数据(或抛出异常)。只有这样它才能真正检查传出数据并发送它。

读取数据应该保留在一个单独的线程中,但不需要在线程中发送数据。发送数据不是阻止呼叫。您的数据将被推送到某个本地缓冲区,并且在将来的某个时刻,操作系统将负责其余的工作。您的写入方法应该更像:

public void writeData(String data)
{
    foreach(StreamWriter clientWriter in ClientWriters)
    {
        clientWriter.WriteLine(outData);
        clientWriter.Flush();
    }
}

ClientWriters是一个应该在connect / disconnect上维护的List。还有其他方法可以编写此方法,但基本上,您需要立即发送传出数据。