Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程服务器_C#_Multithreading_Sockets_Networkstream - Fatal编程技术网

C# 多线程服务器

C# 多线程服务器,c#,multithreading,sockets,networkstream,C#,Multithreading,Sockets,Networkstream,我已经实现了一个服务器,现在正试图使其多线程化,但是遇到了一个问题,即服务器在接收数据时出现故障,StreamWriter无法从流中读取数据 代码如下: class whereisServer { static Socket connection; static object threadLock = new object(); static void Main(string[] args) { Thread t = new Thread(new

我已经实现了一个服务器,现在正试图使其多线程化,但是遇到了一个问题,即服务器在接收数据时出现故障,
StreamWriter
无法从
流中读取数据

代码如下:

class whereisServer
{
    static Socket connection;
    static object threadLock = new object();

    static void Main(string[] args)
    {
        Thread t = new Thread(new ThreadStart(Run));
        t.Start();
    }

    static void Run()
    {
        NetworkStream socketStream;
        TcpListener listener;
        const int PORT = 43;
        try
        {
            listener = new TcpListener(IPAddress.Any, PORT);
            listener.Start();
            while (true)
            {
                connection = listener.AcceptSocket();
                socketStream = new NetworkStream(connection);
                try
                {
                    connection.ReceiveTimeout = 1000;
                    connection.SendTimeout = 1000;
                    Thread t = new Thread(new ParameterizedThreadStart(DoRequest));
                    t.Start(socketStream);
                    //DoRequest(socketStream);
                }
                catch (IOException e)
                {
                    Console.WriteLine(e.Message + "\nTimeOut Handled");
                }
                finally
                {
                    socketStream.Close();
                    connection.Close();
                }
            }
        }
        catch (SocketException e)
        {
            Console.WriteLine(e.Message);
        }
    }

    static void DoRequest(object stream)
    {
        NetworkStream socketStream = (NetworkStream)stream;
        StreamWriter writer = new StreamWriter(socketStream);
        StreamReader reader = new StreamReader(socketStream);

        lock (threadLock)
        {
             //DO SERVER STUFF HERE
        }
在没有线程的情况下调用
DoRequest
方法时,程序运行正常,但是在注释该方法并调用线程版本时,问题就出现了


如果有人能提出
无法运行的原因,我将不胜感激。

在多线程情况下,您调用
关闭
方法的速度比
DoRequest
更快

这是因为这两条线在最后一块

socketStream.Close();
connection.Close();
这两行是在
Start
方法启动新线程之后,但在该线程在
DoRequest
中完成其工作之前立即执行的


我建议您在
DoRequest
中调用这些方法。您可以将
connection
对象传递到
DoRequest
,然后在
DoRequest
内部创建
socketStream
,完成后,在完成
DoRequest
方法之前关闭这两个对象。(或者您可以使用任何其他解决方案,这只是一个选项。)

如果您向我们提供了错误消息,将会有所帮助。。除此之外,我们只能猜测问题出在哪里“流不可写。此外,它还表示我的StreamWriter和StreamReader等于null,尽管我已经创建了它们。当我不使用线程时,这段代码可以很好地工作。谢谢,除了我只能通过线程上的Start方法传递一个参数外,这段代码工作正常,我目前正在传递NetworkStream。您建议如何关闭DoRequest方法内的连接。谢谢您可以在DoRequest中使用try finally。好的,谢谢您,我已经能够实现这一点,但是自从我开始使用线程版本以来,我的DoRequest方法已经停止正常工作。当从客户端输入时,它会更新一个人的位置,但现在不会了。我的DoRequest方法如下所示: