2010-04-07 54 views
2

在异步处理程序中我从webrequest中创建一个IObservable,它返回一个重定向字符串。IHttpAsyncHandler和IObservable web请求

我订阅了那个observable并调用了AsyncResult.CompleteCall(),但我不得不使用Thread.Sleep(100)来获得它的执行。而且每次都不行。我很确定这是不正确的。你能否照亮一些光。谢谢!

public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object state) 
    { 
     _context = context; 
     _ar = new AsyncResult(cb, state); 

     _tweet = context.Request["tweet"]; 
     string url = context.Request["url"]; 

     if(String.IsNullOrEmpty(_tweet) || String.IsNullOrEmpty(url)) 
     { 
      DisplayError("<h2>Tweet or url cannot be empty</h2>"); 
      return _ar; 
     } 

     _oAuth = new oAuthTwitterRx(); 
     using (_oAuth.AuthorizationLinkGet().Subscribe(p => 
     { 
      _context.Response.Redirect(p); 
      _ar.CompleteCall(); 
     }, 
       exception => DisplayError("<h2>Unable to connect to twitter, please try again</h2>") 
       )) 


     return _ar; 
    } 

public class AsyncResult : IAsyncResult 
{ 
    private AsyncCallback _cb; 
    private object _state; 
    private ManualResetEvent _event; 
    private bool _completed = false; 
    private object _lock = new object(); 

    public AsyncResult(AsyncCallback cb, object state) 
    { 
     _cb = cb; 
     _state = state; 
    } 

    public Object AsyncState 
    { 
     get { return _state; } 
    } 

    public bool CompletedSynchronously 
    { 
     get { return false; } 
    } 

    public bool IsCompleted 
    { 
     get { return _completed; } 
    } 

    public WaitHandle AsyncWaitHandle 
    { 
     get 
     { 
      lock (_lock) 
      { 
       if (_event == null) 
        _event = new ManualResetEvent(IsCompleted); 
       return _event; 
      } 
     } 
    } 

    public void CompleteCall() 
    { 
     lock (_lock) 
     { 
      _completed = true; 
      if (_event != null) 
       _event.Set(); 
     } 

     if (_cb != null) 
      _cb(this); 
    } 
} 

回答