多线程回调

时间:2013-06-26 20:21:13

标签: c# multithreading networking tcpclient

所以我正在尝试创建一个使用TcpClient从服务器发送和接收数据的系统。我有一个线程正在侦听数据。

我想要的是能够创建一个方法:

写入流>等待回复>流程响应

但与此同时,其他不相关的数据也可能在此期间出现,所以我不能这样做:

writer.WriteLine("");
string response = reader.ReadLine();

我在这个问题中看'回调'> Callbacks in C#似乎这是我需要的方式,但我不完全确定如何继续这样做。

对此有任何帮助都很棒,谢谢!

编辑Jim Mischel:

这是我想要达到的目标:

public bool Login(string username, string password) {
    writer.Write("{ \"username\" : \"" + username + "\", \"password\" : \"" + password + "\" }";
    //Somehow get the response which is being ran on another thread (See below)

    //Process the JSON into a object and check is successful or not 
    if (msg.result == "Ok") return true;
    else return false;
}

private void ReadThread()
{
    while (running)
    {
        if (ns.DataAvailable)
        {
            string msg = reader.ReadLine();
            if (String.IsNullOrEmpty(msg)) continue;
            Process(msg); //Process the message aka get it back to the Login method
        }
    }
}

编辑2: 基本上我希望能够调用一个登录方法,该方法将写入TcpClient并等待从同一个流接收回复,然后返回一个布尔值。

但是这样的基本方法不会削减它:

public bool Login(string username, string password) {
    writer.Write("{ \"username\" : \"" + username + "\", \"password\" : \"" + password + "\" }";
    string response = reader.ReadLine();
    if (response == "success") return true;
    else return false;
}

这不起作用,因为其他数据会自动通过流推送给我,所以在等待ReadLine()时,我可能会得到任何其他数据而不是我正在寻找的响应。

所以我正在寻找一个可以解决这个问题的解决方案,目前我有一个运行的线程,纯粹是为了从流中读取然后处理消息,我需要从该线程获取消息到上面这个方法

我想到这样做的一种方法是在读取消息时将其放入全局List中,然后将Login方法置于循环中,该循环检查List直到在列表中找到消息。但如果我思考正确,这是一个可怕的概念。所以我正在寻找替代方案。

1 个答案:

答案 0 :(得分:0)

我的错误。我看到你只想创建一个客户端。下面的大部分内容仍然相关,特别是链接答案中的异步读/写内容。你可以从中挖出相关的部分。或者搜索[TcpClient异步示例]。有一些很好的样本。

.NET中最简单的方法是使用TcpListenerBeginAcceptTcpClient来异步创建连接。然后,您可以从TcpClient获取网络流,并使用BeginRead / EndReadBeginWrite / EndWrite进行异步读取和写入。

链接主题有一些很好的例子。在某处有一个TCP侦听器示例。 。

啊哈!这是:https://stackoverflow.com/a/6294169/56778