繁体   English   中英

3.5中没有TPL的无阻塞等待

[英]Non-blocking wait without TPL in 3.5

如何在不阻塞线程且没有TPL'ContinueWith的情况下执行等待? 对于前。 在3.5吗? 我知道TPL的3.5版本(由RX团队提供),但是我很好奇-我可以使用哪种线程原语(... TPL的情况如何)。 TPL中的ContinueWith替代品有哪些?

//这个处理程序会在异步IO操作期间阻塞线程吗?

public class AsyncHandler : IHttpAsyncHandler
    {
        public void ProcessRequest(HttpContext ctx)
        {
            // not used
        }

    public bool IsReusable
    {
        get { return false; }
    }

    public IAsyncResult BeginProcessRequest(HttpContext ctx,
                                            AsyncCallback cb,
                                            object obj)
    {
        AsyncRequestState reqState =
                            new AsyncRequestState(ctx, cb, obj);
        AsyncRequest ar = new AsyncRequest(reqState);
        ThreadStart ts = new ThreadStart(ar.ProcessRequest);
        Thread t = new Thread(ts);
        t.Start();

        return reqState;
    }

    public void EndProcessRequest(IAsyncResult ar)
    {
        AsyncRequestState ars = ar as AsyncRequestState;
        if (ars != null)
        {
            // Some cleanup
        }
    }
}
class AsyncRequestState : IAsyncResult
{
    public AsyncRequestState(HttpContext ctx,
                                AsyncCallback cb,
                                object extraData)
    {
        _ctx = ctx;
        _cb = cb;
        _extraData = extraData;
    }

    internal HttpContext _ctx;
    internal AsyncCallback _cb;
    internal object _extraData;
    private bool _isCompleted = false;
    private ManualResetEvent _callCompleteEvent = null;

    internal void CompleteRequest()
    {
        _isCompleted = true;
        lock (this)
        {
            if (_callCompleteEvent != null)
                _callCompleteEvent.Set();
        }           
        if (_cb != null)
            _cb(this);
    }

    public object AsyncState
    { get { return (_extraData); } }
    public bool CompletedSynchronously
    { get { return (false); } }
    public bool IsCompleted
    { get { return (_isCompleted); } }
    public WaitHandle AsyncWaitHandle
    {
        get
        {
            lock (this)
            {
                if (_callCompleteEvent == null)
                    _callCompleteEvent = new ManualResetEvent(false);

                return _callCompleteEvent;
            }
        }
    }
}

class AsyncRequest
{
    private AsyncRequestState _asyncRequestState;

    public AsyncRequest(AsyncRequestState ars)
    {
        _asyncRequestState = ars;
    }

    public void ProcessRequest()
    {
        //calling webservice or executing sql command asynchronously
        AsyncIOOperationWithCallback(state =>
                                        {
                                            ((AsyncRequestState)state.Context)._ctx.Response.Write("Operation completed");
                                            _asyncRequestState.CompleteRequest();
                                        }, _asyncRequestState);

    }
}

根据定义,等待是“阻塞”。 您可以等待另一个线程,但是会阻塞线程。 如果通过“非阻止”表示不阻止UI ,则可以等待另一个线程并通过event通知UI线程(必要时将处理InvokeRequired / BeginInvoke )。

如果这不是您要的内容,请提供更多详细信息。

通常在不阻塞线程的情况下处理异步操作的方式是使异步操作支持回调。 TPL确实在这里没有做任何魔术。 如果基础操作在某个时候不支持某种形式的回调,那么最终您仍然会遇到阻塞。 经典的“开始/结束” 异步编程模型可以很好地处理此要求。

TPL真正的亮点在于为异常处理/聚合提供更好的支持,并允许使用更复杂的延续模型(例如ContinueWhenAll或ContinueWhenAny。)还为取消提供了新的支持,包括防止后续延续。 但是,延续本身实际上只是一个更高级,更清洁的程序包中的回调。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM