0

假設我有一個異步方法,下面的方法簽名:轉換異步方法使用任務並行庫

public IAsyncResult MyAsyncMethod(AsyncCallback asyncCallback, object state); 

,因此,我用下面的代碼來調用它,併爲它分配一個state對象,回調:

public class test 
{ 
    // Private class to hold/pass-through data used by Async operations 
    private class StateData 
    { 
     //... Whatever properties I'll need passed to my callback ... 
    } 

    public void RunOnSeparateThread() 
    { 
     StateData stateData = new StateData { ... }; 
     MyAsyncMethod(m_asyncCallback, stateData); 
    } 

    private AsyncCallback m_asyncCallback = new AsyncCallback(AsyncComplete); 
    private static void AsyncComplete(IAsyncResult result) 
    { 
     // Whatever stuff needs to be done after completion of Async method 
     // using data returned in the stateData object 
    } 
} 

我希望做使用任務並行庫同樣的事情,我不能確定如何做到這一點。什麼是正確的代碼,以達到相同的結果,是:在一個單獨的線程

  1. 運行MyAsyncMethod
  2. 完成後有state對象返回它傳遞給下一個方法 - 在這種情況下AsyncComplete

或者還有更好的方法來完成相同的結果嗎?另外,雖然這是用C#編寫的,但我在VB和C#中也很舒服,所以任何答案都將不勝感激。

謝謝你,希望這是有道理的。

+2

這應該幫助您開始:http://www.albahari.com/threading/part5.aspx#_Task_Parallelism –

+0

非常感謝,@JoshL,看起來像一個非常有用的鏈接 - 現在看看它。 –

+0

也許[這在MSDN上](https://msdn.microsoft.com/en-us/library/hh191443.aspx)也不錯。 – pid

回答

1

假設我有一個異步方法,下面的方法簽名:

public IAsyncResult MyAsyncMethod(AsyncCallback asyncCallback, object state); 

我希望返回值是Task<T>IAsyncResult通常從BeginXYZ返回時存在匹配的EndXYZ在原始的.NET異步模式),並沒有採取回調。 (如上所述,它似乎是一種模式,另一種模式。)

如果我的期望是正確的,那麼只需調用該方法並使用重新調用的Task<T>即可。

如果真的是一個IAsyncResult然後TaskFactory有一個輔助方法:FromAsync(其中包括)其大量重載可以採取IAsyncResultAction<IAsyncResult>

所以,你的代碼就變成了:

var ia = MyAsyncMethod(() => {}, null); 
var t = Task.Factory.FromAsync(ia, x => { 
    // called with ia from MyAsyncMethod on completion. 
    // Can close over any state 
}); 

// ... 
var result = (TypeofResult)t.Result; 
+2

't.Result'會阻止。我建議「等待t」,避免潛在的死鎖。 –

+0

@YuvalItzchakov對於4.5以下的.Net框架呢?因爲我不認爲在那之前等待。 –

+1

@Josh如果你使用.NET 4.0並且使用VS2012或更高版本,你可以通過NuGet獲得Bcl.Async庫。如果您使用.NET 4.0和VS2010,則可以使用Task.ContinueWith來訪問已完成的任務。 –