2011-06-16 85 views
0

出於個人興趣,我決定嘗試使用Reactive Extensions(又名Rx)編寫基本Web服務器。幾乎立即,我碰到以下問題:無功擴展Web服務器

HttpListener的異步模式與正常的異步模式簽名不匹配,EndGetContext返回HttpListenerContext而不是IAsyncResult!

所以我的問題是:有沒有辦法解決這個問題?

下面是一些代碼 - 編譯器(正確地)抱怨的第二個參數Observable.FromAsyncPattern:

更新 - 正如喬恩正確地指出,這是不是模式,它的抱怨,我的天堂」 T提供的返回類型 - 這個工程:

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

回答

3

的正常模式。它是BeginGetContext,它返回IAsyncResult; EndGetContext需要IAsyncResult並返回異步操作的結果 - 上下文。這與(如)Stream.BeginRead/EndRead完全相同,其中EndRead返回int,即讀取的字節數。

當您嘗試發佈的代碼時會發生什麼?我不能立即明白爲什麼它不起作用。

+0

謝謝 - 很好發現:) – Nathan 2011-06-16 08:38:31

0

找出FromAsyncPattern的模板參數的訣竅是想象您正在創建一個與該函數的同步版本匹配的Func。

在這種情況下,原型是:

public HttpListenerContext GetContext()

這意味着,我的Func鍵看起來像:

Func<HttpListenerContext>

然後,只需把你的模板參數和複製粘貼它到FromAsyncPattern。