C#Tcp连接异步/等待

时间:2017-04-20 12:21:57

标签: c# tcp async-await

我有一个关于TCP连接类I问题的问题。

我已编写的连​​接类可以通过TCP建立连接。它从两个不同的线程侦听并写入该连接。现在我想改进那个班级。

我想完全异步建立此连接,以便在我的应用程序中的其他内容准备好的同时建立连接。 但我有一些其他类需要已建立的连接才能正常工作。所以,我的问题是,有人可以用一个小例子向我解释如何建立连接异步,并且在建立连接后其他类可能会开始工作吗?

我的第一个想法是在连接TCP客户端之后触发一个事件但是我遇到了这样一个事实,即如果远程服务器发回消息,则连接完全建立。 之后,我有了创建连接状态的想法。但现在我不知道如何继续前进。

如果不是如何使用等待和异步的方式,请告诉我。

提前致谢, 帕特里克

编辑:

感谢您的回答。澄清我要更新帖子的内容。

当有人要求我到目前为止,我在GitHub发布了我的源代码。在Line 46中,我将连接状态设置为“正在连接”。建立TCP连接后,我将状态更改为“提取”(L155)。现在我必须等待表明连接已完全准备好的消息。消息传来之后,我预计我会将State设置为Open(L315)并触发ConnectionEstablished事件。

请原谅但我不能发布2个以上的链接。

1 个答案:

答案 0 :(得分:0)

我的意思是:而不是使用线程块;使用ManualresetEvent为TCP连接编写一个Task。使Thread的另一部分基于ManualresetEvent更改其状态。我个人喜欢任务链接是 - > https://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v=vs.110).aspx 通过Thread或Threadpool。 编辑:我今天在记事本上写了这个。如果它提供任何帮助。

Task t = Task.Run(() =>
            {
                //do the connection thing
                Connection();
                connectionDone.Set(); //Manualeventreset connectionDone = new ManualResetEvent(false);
            });
        try
        {
            t.Wait();
        }
        catch (AggregateException ae)
        {
            //write the exception somewhere
            WriteLog("Exception in task: " + ae);
        }
        finally
        {
            connectionDone.Reset();
        }