出于个人兴趣,我决定尝试使用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
的是BeginGetContext
;EndGetContext
取一个IAsyncResult
,并返回异步操作的结果-上下文。这与Stream.BeginRead
/EndRead
完全相同,其中EndRead
返回int
,即读取的字节数。
当你尝试你发布的代码时会发生什么?我不明白为什么它不起作用。
计算FromAsyncPattern的模板参数的技巧是假设您正在创建一个与函数的同步版本匹配的Func。
在这种情况下,原型是:
public HttpListenerContext GetContext()
这意味着,我的Func看起来像:
Func<HttpListenerContext>
然后,只需获取模板参数并将其复制粘贴到FromAsyncPattern。