2012-09-25 60 views
0

我怎麼能不阻塞線程,並沒有第三方物流ContinueWith執行的等待?例如。在3.5?我知道TPL的移植版本爲3.5(由RX團隊提供),但我很想知道 - 我可以使用哪些線程原語(...什麼是TPL場景)。在TPL中有什麼ContinueWith替代品?非阻塞在等待而不TPL 3.5

//將異步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); 

    } 
} 
+0

有關使用信令如何構造 –

+3

究竟什麼是「非阻斷,等待」? –

+0

你想等什麼? – svick

回答

0

等等,顧名思義就是「阻塞」。你可以在另一個線程上等待,但你會阻止線程。如果「非阻塞」你的意思是不是阻塞UI,那麼你就可以等待另一個線程,並通知通過event UI線程(這將處理InvokeRequired/BeginInvoke如果需要的話)。

如果這不是你問的,請提供更多的細節。

0

你通常處理異步操作的方式,而不阻塞線程是讓你的異步操作的支持回調。 TPL在這裏真的沒有什麼魔法;如果底層操作在某個時候不支持某種形式的回調,那麼最終仍然會阻塞某些阻塞。經典的「開始/結束」Asynchronous Programming Model完美地處理了這個要求。

當TPL真正的亮點是提供了異常處理/匯聚更好的支持,並允許更復雜的延續機型(如ContinueWhenAll或ContinueWhenAny)還爲消除新的支持,包括預防後續延續。儘管如此,延續本身只不過是一個更加漂亮,更清潔的包裝中的回調。

+0

感謝您的回答!我編輯了我的問題。 – SalientBrain