2010-04-07 5 views
2

В обработчике Async я создаю IObservable из webrequest, который возвращает строку перенаправления.IHttpAsyncHandler и IObservable веб-запросы

Я подписываюсь на это наблюдаемое и вызывающее 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); 
    } 
} 

ответ

 Смежные вопросы

  • Нет связанных вопросов^_^