如何在不阻塞线程和没有第三方逻辑ContinueWith的情况下执行等待?对于ex。在3.5中?我知道TPL的3.5移植版本(由RX团队提供),但我很好奇-我可以使用哪些线程原语(...第三方物流的场景是什么)。第三方物流中的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);
}
}发布于 2012-09-25 22:55:39
根据定义,等待就是“阻塞”。你可以等待另一个线程,但是你会阻塞那个线程。如果您所说的“非阻塞”是指不阻塞UI,那么您可以等待另一个线程,并通过event通知UI线程(如果需要,它将处理InvokeRequired/BeginInvoke )。
如果这不是您要问的,请提供更多详细信息。
发布于 2012-09-25 23:21:59
通常,在不阻塞线程的情况下处理异步操作的方法是让异步操作支持回调。TPL在这里真的没有什么神奇之处;如果底层操作在某种程度上不支持某种形式的回调,您最终仍然会遇到阻塞。经典的“Begin/End”Asynchronous Programming Model很好地处理了这个需求。
第三方公共的真正闪光点在于为异常处理/聚合提供了更好的支持,并允许更复杂的延续模型(如ContinueWhenAll或ContinueWhenAny)。还提供了对取消的新支持,包括防止后续继续。不过,Continuation本身实际上只不过是一个更花哨、更干净的包中的回调。
https://stackoverflow.com/questions/12584803
复制相似问题