2017-03-16 25 views
2

我正在使用一些c#應用程序並使用一些Async調用。我必須使用來自特定供應商的SDK來集成到供應商平臺中。它看起來很喜歡SDK異步方法基於5.0之前的C#,並使用APM模型而不是TPM(我的大多數異步工作都使用了TPM和await命令)。Async和FromAsync

我發現了FromAsync方法將一個APM異步方法封裝到TPM中,但它有一個困難的時間(希望我在正確的路徑上)。

有問題的異步方法稱爲「CommitAsync」,它來自供應商SDK。當我懸停在VS的方法,它輸出這樣的:

EditableListConfigurationObject<UserConfiguration.Property>.CommitAsync(System.ComponentMode.AsyncCompletedEventHandler completedCallback, object userState) 

所以我試圖轉換到TPM,到目前爲止,有這樣的(這是引發錯誤):

var x = Task.Factory.FromAsync(userConfigurationObject.CommitAsync, UserCreated); 

UserCreated是我的回調函數

private void UserCreated(Object sender, SystemComponentMode.AsyncCompletedEventArgs args) 
{} 

當我將鼠標懸停在「userConfigurationOBject.CommitAsync在FromAsync方法,它說:‘不能從方法組轉換爲IAsyncResult的’

據我所知,FromAsync中的第一個參數是begin函數,第二個參數是結束/完整函數。如果我正確理解APM異步模型和此SDK,我會假設CommitAsync將作爲begin函數,然後它的回調函數將結束函數?

回答

1

Task.FromAsync是專爲APM-style asynchronicity轉換成TAP-style asynchronicity方法。因此,這裏不合適。

對於一個更廣義的方法來轉換的東西,異步發生到TAP風格,使用TaskCompletionSource<T>做一個更「手動」轉換。大約,它會去是這樣的:

TaskCompletionSource<SystemComponentMode.AsyncCompletedEventArgs> tcs = 
    new TaskCompletionSource<SystemComponentMode.AsyncCompletedEventArgs>(); 

EditableListConfigurationObject<UserConfiguration.Property> 
    .CommitAsync((sender,args) => { 
     tcs.SetResult(args); //or perhaps tcs.SetException in some cases? 
    }, object userState); 

var resultArgs = await tcs.Task; 

就個人而言,我覺得Task.FromAsync能與所有的重載非常討厭。使用TaskCompletionSource更容易理解。

+0

謝謝!使用TaskCompletionSource,一切都很好。我會對此做更多的研究,以確保我完全理解它,但現在,這讓我感動,並證明它可以完成! –

0

不,CommitAsync根本不遵循APM,因爲它不提供FromAsync所期望的。你可以看到更多的類型,它確實與文檔中工作FromAsync.