C# 反应式扩展Web服务器

C# 反应式扩展Web服务器,c#,webserver,system.reactive,C#,Webserver,System.reactive,出于个人兴趣,我决定尝试使用(aka Rx)编写一个基本的web服务器。我几乎立刻遇到了以下问题: HttpListener的异步模式与正常异步模式签名不匹配,EndGetContext返回HttpListenerContext而不是IAsyncResult 所以我的问题是:有办法解决这个问题吗 下面是一些代码-编译器(正确地)抱怨Observable.FromAsyncPattern的第二个参数: 更新-正如Jon正确指出的,这不是模式,而是抱怨我没有提供返回类型-这很有效: var obse

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

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

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

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

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

var observable = Observable.FromAsyncPattern<HttpListenerContext>(listener.BeginGetContext, listener.EndGetContext);
这是正常的模式。它返回的是
IAsyncResult
;获取一个
IAsyncResult
,并返回异步操作的结果-上下文。这与(比如)Stream.BeginRead/
EndRead
完全相同,其中
EndRead
返回一个
int
,即读取的字节数

当您尝试发布的代码时会发生什么?我无法立即理解为什么它不起作用。

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


当您尝试发布的代码时会发生什么?我无法立即理解它为什么不起作用。

计算FromAsyncPattern的模板参数的诀窍是,想象您正在创建一个与函数的同步版本相匹配的Func

在这种情况下,原型是:

public HttpListenerContext GetContext()

也就是说,我的Func看起来像:

Func


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

计算FromAsyncPattern模板参数的诀窍是,想象您正在创建一个与函数的同步版本相匹配的Func

在这种情况下,原型是:

public HttpListenerContext GetContext()

也就是说,我的Func看起来像:

Func

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

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();
            }
        }
    }
}