Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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# 异步套接字消息是否可以再等待5秒以等待下一个套接字消息?_C#_Visual Studio_C# 4.0_C# 3.0_C# 2.0 - Fatal编程技术网

C# 异步套接字消息是否可以再等待5秒以等待下一个套接字消息?

C# 异步套接字消息是否可以再等待5秒以等待下一个套接字消息?,c#,visual-studio,c#-4.0,c#-3.0,c#-2.0,C#,Visual Studio,C# 4.0,C# 3.0,C# 2.0,在我的项目中,我使用异步套接字服务器,如下所示 for (int i = 0; i < localip.Length; i++) { try { m_mainSocket[1] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp

在我的项目中,我使用异步套接字服务器,如下所示

for (int i = 0; i < localip.Length; i++)
                {
                    try
                    {


                        m_mainSocket[1] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        m_mainSocket[1].Bind(new IPEndPoint(localip[i], port));
                        m_mainSocket[1].Listen(1000);
                        m_mainSocket[1].BeginAccept(new AsyncCallback(OnClientConnect2), m_mainSocket[1]);
                        Log.updateErrorlog(localip[i].ToString()+" Port : "+port);
                    }
                    catch
                    { }
                }

public void OnClientConnect2(IAsyncResult ar)
        {

            Socket listener2 = (Socket)ar.AsyncState;
            try
            {

                NewConnection2(listener2.EndAccept(ar));
                listener2.BeginAccept(new AsyncCallback(OnClientConnect2), listener2);
            }
            catch
            {

                listener2.Close();

            }
        }
        public void NewConnection2(Socket sockClient)
        {
            SocketChatClient client2 = new SocketChatClient(sockClient);
            //m_aryClients.Add(client2);
            client2.SetupRecieveCallback2(this);
            if (!InvokeRequired)
            {

            }
            else
            {

            }
        }

        public void WaitForData(System.Net.Sockets.Socket soc)
        {

            SocketChatClient client2 = new SocketChatClient(soc);
            client2.SetupRecieveCallback2(this);

        }

        public void OnDataReceived(IAsyncResult ar)
        {

            SocketChatClient client = (SocketChatClient)ar.AsyncState;
            byte[] aryRet = client.GetRecievedData(ar);
            string mdz3 = "";
            mdz3 = System.Text.Encoding.ASCII.GetString(aryRet, 0, aryRet.Length);

            if (aryRet.Length < 1)
            {
                client.Sock.Close();

                return;
            }

            messageReceived msend = new messageReceived(mdz3, aryRet, client.Sock);
            msend.msg_thread.Start();

            msend.msg_thread.Join();

            client.SetupRecieveCallback2(this);


        }

当我收到第一条套接字消息时,我想再等待5秒钟,等待第二条套接字消息并处理两条消息。如果我在5秒内没有收到任何东西,我将继续处理第一个。请告知。多谢各位

为什么不让邮件处理线程一直运行?您将消息发布到它,并让它处理额外的处理逻辑,比如再等待5秒等待第二条消息。大致如下:

public class MessageProcessor
{
    private Thread _ProcessingThread;
    private Queue<Message> _MessageQueue;
    private AutoResetEvent _MessagePosted;

    public MessageProcessor()
    {
        _MessagePosted = new AutoResetEvent(false);
        _MessageQueue = new Queue<Message>();
        _ProcessingThread = new Thread(ProcessMessages);
        _ProcessingThread.Start();
    }

    public void Post(Message msg)
    {
        _MessageQueue.Enqueue(msg);
        _MessagePosted.Set();
    }

    private void ProcessMessages(object state)
    {
        while (!_Quit)
        {
            _MessagePosted.WaitOne();
            _MessagePosted.WaitOne(TimeSpan.FromSeconds(5));
            ... process message queue
        }
    }
}
您需要加入一些锁来保护您的队列等(尽管对于.NET4,您有
ConcurrentQueue
)。您还可以在消息处理线程上使用
BeginInvoke
来处理异步处理

public class MessageProcessor
{
    private Thread _ProcessingThread;
    private Queue<Message> _MessageQueue;
    private AutoResetEvent _MessagePosted;

    public MessageProcessor()
    {
        _MessagePosted = new AutoResetEvent(false);
        _MessageQueue = new Queue<Message>();
        _ProcessingThread = new Thread(ProcessMessages);
        _ProcessingThread.Start();
    }

    public void Post(Message msg)
    {
        _MessageQueue.Enqueue(msg);
        _MessagePosted.Set();
    }

    private void ProcessMessages(object state)
    {
        while (!_Quit)
        {
            _MessagePosted.WaitOne();
            _MessagePosted.WaitOne(TimeSpan.FromSeconds(5));
            ... process message queue
        }
    }
}
messageProcessor.Post(receivedMessage);