首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >3.5中无TPL的非阻塞等待

3.5中无TPL的非阻塞等待
EN

Stack Overflow用户
提问于 2012-09-25 22:11:34
回答 2查看 619关注 0票数 0

如何在不阻塞线程和没有第三方逻辑ContinueWith的情况下执行等待?对于ex。在3.5中?我知道TPL的3.5移植版本(由RX团队提供),但我很好奇-我可以使用哪些线程原语(...第三方物流的场景是什么)。第三方物流中的ContinueWith替代方案是什么?

//此处理程序是否会在异步IO操作期间阻止线程?

代码语言:javascript
复制
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);

    }
}
EN

回答 2

Stack Overflow用户

发布于 2012-09-25 22:55:39

根据定义,等待就是“阻塞”。你可以等待另一个线程,但是你会阻塞那个线程。如果您所说的“非阻塞”是指不阻塞UI,那么您可以等待另一个线程,并通过event通知UI线程(如果需要,它将处理InvokeRequired/BeginInvoke )。

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

票数 0
EN

Stack Overflow用户

发布于 2012-09-25 23:21:59

通常,在不阻塞线程的情况下处理异步操作的方法是让异步操作支持回调。TPL在这里真的没有什么神奇之处;如果底层操作在某种程度上不支持某种形式的回调,您最终仍然会遇到阻塞。经典的“Begin/End”Asynchronous Programming Model很好地处理了这个需求。

第三方公共的真正闪光点在于为异常处理/聚合提供了更好的支持,并允许更复杂的延续模型(如ContinueWhenAll或ContinueWhenAny)。还提供了对取消的新支持,包括防止后续继续。不过,Continuation本身实际上只不过是一个更花哨、更干净的包中的回调。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12584803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档