客户服务器问题

时间:2010-12-16 20:19:44

标签: c# multithreading

如果我有一个连接到服务器的客户端,如果服务器崩溃,我如何确定,如果连接已关闭,请形成我的客户端?我的想法是,如果在我的客户端while我等待从我的服务器(String a = sr.ReadLine();)读取一行,当客户端等待接收该行时,服务器崩溃,我该如何关闭该线程包含我的while

许多人告诉我,在while(alive) { .. }中我应该将alive值更改为true,但是如果我的程序当前正在等待读取行,那么它将无法退出,因为它会被困在sr.ReadLine()

我在想,如果我不能向服务器发送一行,我应该用.abort()关闭客户端线程。有任何想法吗 ?

5 个答案:

答案 0 :(得分:2)

TimeOut方法中有一个ReadLine参数,如果没有收到回复,则会在该时间间隔后取TimeSpan个值并超时..

public string ReadLine(TimeSpan timeout)
{
   // ..your logic.
)

例如,查看这些SO帖子 -

Implementing a timeout on a function returning a value

Implement C# Generic Timeout

答案 1 :(得分:1)

服务器应用程序是您自己的,还是现成的东西?

如果是您的,请每隔几秒发送一次“心跳”,让客户知道连接和服务仍然存在。 (这比仅查看连接是否关闭更可靠,因为在服务器应用程序被锁定时,连接可能会保持打开状态。)

答案 2 :(得分:0)

如果服务器崩溃,我想你会遇到更多问题而不仅仅是修复一个while循环。由于其他原因,您的程序可能会进入不稳定状态。国家不应该被忽视。话虽这么说,一个很好的“服务器超时”消息可能就足够了。您可以更进一步并ping,然后给出稍微更高级的消息“服务器似乎已关闭”。

答案 3 :(得分:0)

服务器崩溃与您的客户无关。有几个外部因素可以使连接失败:客户端就是其中之一,互联网/局域网问题是另一个。

无论为何失败都无关紧要,服务器无论如何都应该处理它。服务器停机会让你的用户尖叫;)

关于多线程,我建议您查看BeginXXX / EndXXX异步方法。它们为您提供更强大的功能和更强大的解决方案。

答案 4 :(得分:0)

尽量避免任何依赖线程中止()的策略。如果你无法避免它,请确保你理解该机制的习惯用法,包括拥有一个单独的appdomain并捕获ThreadAbortException