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