none
一个关于异步HttpListener的问题 RRS feed

  • 问题

  •  

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using DevSDK.Net.Sockets;
    using System.IO;

    namespace ConsoleApplication1
    {
        class Program
        {
            static HttpListener sSocket = null;
           
            static void Main(string[] args)
            {
                sSocket = new HttpListener();

                sSocket.Prefixes.Add("http://127.0.0.1:8080/");

                sSocket.Start();

                sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);

                Console.Read();           
            }

            static void GetContextCallBack(IAsyncResult ar)
            {
                try
                {
                    sSocket = ar.AsyncState as HttpListener;

                    HttpListenerContext context = sSocket.EndGetContext(ar);

                    Console.WriteLine(context.Request.Url.PathAndQuery);

                    // 这里我要进行数据库查询。。新来的连接它怎么处理的?

                }
                catch { }
                sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);
            }
        }
    }


    请问。这个异步HTTPLISTENER实现代码。。。假如进行数据库查询的那个地方。需要很长很长时间。

    那么,新进来的连接请求

    是被怎么处理的呢?是进行排队?还是异步本身就是一个多线程呢?

    如果是排队。请问怎么解决并发的问题?

    2009年2月14日 19:29

答案

  • 1 按照你目前的代码是排队

                sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);

    这一句运行前 是不可能进行下一次accept的

    但是如果你改变流程  就可以实现完全并发


            static void GetContextCallBack(IAsyncResult ar)
            {
                try
                {
                    sSocket = ar.AsyncState as HttpListener;

                    HttpListenerContext context = sSocket.EndGetContext(ar);

                    Console.WriteLine(context.Request.Url.PathAndQuery);


    sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);


                    // 先打开下一次context的大门 然后我在这个后面处理别的事情

                }
                catch { }
                
            }


    梁赫群是榜样 赵正平是偶像 恩?还有个人么?
    • 已标记为答案 付海超 2009年2月16日 5:22
    2009年2月16日 2:22

全部回复

  • 1 按照你目前的代码是排队

                sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);

    这一句运行前 是不可能进行下一次accept的

    但是如果你改变流程  就可以实现完全并发


            static void GetContextCallBack(IAsyncResult ar)
            {
                try
                {
                    sSocket = ar.AsyncState as HttpListener;

                    HttpListenerContext context = sSocket.EndGetContext(ar);

                    Console.WriteLine(context.Request.Url.PathAndQuery);


    sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);


                    // 先打开下一次context的大门 然后我在这个后面处理别的事情

                }
                catch { }
                
            }


    梁赫群是榜样 赵正平是偶像 恩?还有个人么?
    • 已标记为答案 付海超 2009年2月16日 5:22
    2009年2月16日 2:22
  •  try
                {

    sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);

                    sSocket = ar.AsyncState as HttpListener;

                    HttpListenerContext context = sSocket.EndGetContext(ar);

                    Console.WriteLine(context.Request.Url.PathAndQuery);




                    // 先打开下一次context的大门 然后我在这个后面处理别的事情

                }
                catch { }

    sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);
    放最前面可以吗

    能不讲下从BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket);

    BeginGetContext后处于什么状态
    到  sSocket = ar.AsyncState as HttpListener;


                    HttpListenerContext context = sSocket.EndGetContext(ar);

    的执行步骤 具体的实现 

       谢谢

    2011年3月9日 8:47