Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Server - Fatal编程技术网

C# 让服务器同时处理两个线程

C# 让服务器同时处理两个线程,c#,multithreading,server,C#,Multithreading,Server,我有两个线程在稍微不同的时间到达服务器程序中的一个点,都发送一个字符串。我希望服务器在此时暂停,直到两个线程都收到字符串,然后继续。目前我正在使用Console.ReadKey()以“暂停”线程。但这不是一个解决方案,因为我需要按两次键(每个线程一次)才能继续 在程序类中是否可能有一个全局计数器,所有线程都可以随时访问和编辑该计数器?与并发字典类似的概念。这样,我可以根据哪个线程首先发送字符串来区分线程,并使程序挂起,直到计数器确信两个客户端都已“应答” class Program {

我有两个线程在稍微不同的时间到达服务器程序中的一个点,都发送一个字符串。我希望服务器在此时暂停,直到两个线程都收到字符串,然后继续。目前我正在使用
Console.ReadKey()以“暂停”线程。但这不是一个解决方案,因为我需要按两次键(每个线程一次)才能继续

在程序类中是否可能有一个全局计数器,所有线程都可以随时访问和编辑该计数器?与
并发字典
类似的概念。这样,我可以根据哪个线程首先发送字符串来区分线程,并使程序挂起,直到计数器确信两个客户端都已“应答”

class Program
{
    public static bool isFirstThread = false;

    static void Main(string[] args)
    {
        runServer();
    }

    static void runServer()
    {
        //server setup
        Thread[] threadsArray = new Thread[2];
        int i = 0;
        try
        {
            while(true) //game loop
            {
                Socket connection;
                connection = listener.AcceptSocket();
                threadRequest = new Handler();

                if(i==0) //first thread
                {
                    threadsArray[i] = new Thread(() => threadRequest.clientInteraction(connection, true);
                }
                else //not first thread
                {
                    threadsArray[i] = new Thread(() => threadRequest.clientInteraction(connection, false);
                }

                threadsArray[i].Start();
                i++;
            }
        }

        catch(Exception e)
        {
            Console.WriteLine("Exception: " + e.ToString());
        }
    }
}


class Handler 
{
    public void clientInteraction(Socket connection, bool isFirstThread)

    {
        string pAnswer = string.Empty;
        //setup streamReaders and streamWriters

        while(true) //infinite game loop
        {
            //read in a question and send to both threads.
            pAnswer = sr.ReadLine();
            Console.WriteLine(pAnswer);

            Console.ReadKey(); //This is where I need the program to hang

            awardPoints(); 

        }
    }
}   
这是我的代码所做的一个粗略的概念,为了避免问题膨胀,我已经切碎了很多东西,所以可能有一些我遗漏了的错误

理论上,我可以在服务器发送问题字符串时设置计时器,但我不希望在这个阶段设置计时器

如有任何想法或建议,将不胜感激。提前感谢。

使用a,它的设计初衷是:让一组线程中的每个线程等待,直到所有线程都达到计算中的某个点。在
runServer()中初始化它,如下所示:

Barrier barrier = new Barrier(2);
并在每个线程的末尾执行此操作:

barrier.SignalAndWait();
使用a,它就是为了这个目的而设计的:让一组线程中的每个线程等待,直到所有线程都达到计算中的某个点。在
runServer()中初始化它,如下所示:

Barrier barrier = new Barrier(2);
并在每个线程的末尾执行此操作:

barrier.SignalAndWait();

带条件的while循环?一个变量通常可由多个线程编辑,除非执行竞争条件。但如果您想等待,请使用带有布尔条件的while循环。该变量将在何处声明?我已经尝试过在程序类中放置一个线程,但是除非在创建线程时通过它,否则这是行不通的。在创建线程时,所建议的while循环的条件是未知的,您是希望两个线程同时继续,还是只希望一个线程继续?您可以始终将变量作为
ref
参数传递…带条件的while循环?一个变量通常可由多个线程编辑,除非执行竞争条件。但如果您想等待,请使用带有布尔条件的while循环。该变量将在何处声明?我已经尝试过在程序类中放置一个线程,但是除非在创建线程时通过它,否则这是行不通的。在创建线程时,所建议的while循环的条件是未知的,您是希望两个线程同时继续,还是只希望一个线程继续?您可以始终将变量作为
ref
参数传递…但不知道这一点。美好的绝对完美。非常感谢。:--在
系统中有很多好东西。线程
-另一个人最喜欢的是
AutoResetEvent
,它让一个线程等待另一个线程发送信号。我不知道这一点。美好的绝对完美。非常感谢。:--在
系统中有很多好东西。线程
-另一个人最喜欢的是
自动resetEvent
,它让一个线程等待另一个线程发送信号。