سؤال

ضمن معالج ASYNC ، أقوم بإنشاء iobservable من WebRequest الذي يعيد سلسلة إعادة توجيه.

أنا أشترك في ذلك يمكن ملاحظته وأدعو 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-

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top