簡體   English   中英

轉換異步方法以使用任務並行庫

[英]Convert an Async method to use Task Parallel Library

假設我為異步方法具有以下方法簽名:

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#同樣滿意,因此,任何答復都將不勝感激。

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

假設我為異步方法具有以下方法簽名:

 public IAsyncResult MyAsyncMethod(AsyncCallback asyncCallback, object state); 

我期望的返回值是Task<T> IAsyncResult通常從返回BeginXYZ時,有一個匹配EndXYZ在原始.NET異步模式)和未服用的回調。 (如前所述,這似乎是一種模式,而另一種模式。)

如果我的期望是正確的,則只需調用該方法並使用重新調整的Task<T>

如果確實是IAsyncResultTaskFactory有一個輔助方法: 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM