反应式扩展Web服务器



出于个人兴趣,我决定尝试使用Reactive Extensions(又名Rx)编写一个基本的web服务器。几乎立刻,我就遇到了以下问题:

HttpListener的异步模式与普通异步模式签名不匹配,EndGetContext返回HttpListenerContext而不是IAsyncResult!

所以我的问题是:有办法解决这个问题吗?

以下是一些代码——编译器(正确地)抱怨Observable的第二个参数。FromAsyncPattern:

更新-正如Jon正确指出的,这不是模式,它抱怨我没有提供返回类型-这很有效:

var observable = Observable.FromAsyncPattern<HttpListenerContext>(listener.BeginGetContext, listener.EndGetContext);

原始代码:

using System;
using System.Net;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RxWebTest
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpListener listener = new HttpListener();
            try
            {
                listener.Start();
                var observable = Observable.FromAsyncPattern(listener.BeginGetContext, listener.EndGetContext);

                Console.ReadLine();
            }
            finally
            {
                listener.Abort();
            }
        }
    }
}

的正常模式。返回IAsyncResult的是BeginGetContextEndGetContext一个IAsyncResult,并返回异步操作的结果-上下文。这与Stream.BeginRead/EndRead完全相同,其中EndRead返回int,即读取的字节数。

当你尝试你发布的代码时会发生什么?我不明白为什么它不起作用。

计算FromAsyncPattern的模板参数的技巧是假设您正在创建一个与函数的同步版本匹配的Func。

在这种情况下,原型是:

public HttpListenerContext GetContext()

这意味着,我的Func看起来像:

Func<HttpListenerContext>

然后,只需获取模板参数并将其复制粘贴到FromAsyncPattern。

相关内容

  • 没有找到相关文章