Frage

Im Async-Handler Ich erstelle eine IObservable von webrequest, die eine Umleitung String zurückgibt.

Ich bin der Anmeldung zu dieser beobachtbaren und ruft AsyncResult.CompleteCall (), aber ich bin gezwungen Thread.Sleep (100) zu verwenden, um sie ausgeführt zu bekommen. Und es nicht jedes Mal arbeiten. Ich bin mir ziemlich sicher, dass dies nicht richtig ist. Könnten Sie bitte etwas Licht leuchten. Vielen Dank!

    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);
    }
}
War es hilfreich?

Lösung

Besser spät als nie; Ich denke, der folgende Artikel beschreibt genau das, was Sie versuchen zu erreichen: http://blogs.msdn.com/b/jeffva/archive/2010/09/15/rx-on-the-server -Teil-5-von-n-beobachtbaren-asp-net.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top