IHTTPASYNCHANDLER и IOBSERIBITALE WEB-запросы
-
25-09-2019 - |
Вопрос
Внутри асинхронизателя я создаю iobsibable из WebRequest, который возвращает Redirect String.
Я подпишусь на то, что наблюдаемый и вызов 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);
}
}
Решение
Лучше поздно тогда никогда; Я думаю, что следующая статья точно объясняет, что вы пытаетесь достичь: http://blogs.msdn.com/b/jeffva/archive/2010/09/15/rx-on-the-server-part-5-of-n-observable-asp-net.aspx.
Не связан с StackOverflow