C# 3.5中无TPL的非阻塞等待
我如何在不阻塞线程和不使用TPL“ContinueWith”的情况下执行等待?例如,在3.5中?我知道TPL的3.5移植版本(由RX团队提供),但我很想知道——我可以使用哪些线程原语来实现这一点(…TPL的场景背后是什么)。第三方物流中的替代方案是什么 //此处理程序是否会在异步IO操作期间阻止线程C# 3.5中无TPL的非阻塞等待,c#,asynchronous,task-parallel-library,wait,C#,Asynchronous,Task Parallel Library,Wait,我如何在不阻塞线程和不使用TPL“ContinueWith”的情况下执行等待?例如,在3.5中?我知道TPL的3.5移植版本(由RX团队提供),但我很想知道——我可以使用哪些线程原语来实现这一点(…TPL的场景背后是什么)。第三方物流中的替代方案是什么 //此处理程序是否会在异步IO操作期间阻止线程 public class AsyncHandler : IHttpAsyncHandler { public void ProcessRequest(HttpContext
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,那么您可以在另一个线程上等待,并通过事件通知UI线程(如果需要,它将处理调用所需的/开始调用)
如果您不是这样要求的,请提供更多详细信息。通常在不阻塞线程的情况下处理异步操作的方法是让异步操作支持回调。TPL在这里真的没有任何魔力;如果底层操作在某个时候不支持某种形式的回调,那么最终还是会遇到阻塞。经典的“开始/结束”完美地处理了这一需求
TPL真正的亮点在于为异常处理/聚合提供更好的支持,并允许更复杂的延续模型(如ContinueWhenAll或ContinueWhenAny)。还有对取消的新支持,包括防止后续延续。不过,Continuation本身实际上不过是一个更高级、更干净的包中的回调。使用信令构造如何确切地说是“非阻塞等待”?您想等待什么?