2014-03-19 127 views
1

我正在使用第三方API,它看起來像使用事件驅動架構編寫的。我正在對API上的某個方法進行異步調用,但方法的響應僅在事件處理程序中返回。因此,我必須訂閱該事件,然後調用API的方法調用。異步事件訂閱

僞代碼示例:

private string myValue; 

public async Task<string> TestPost() 
{ 
    // Subscribe to event 
    api.OnSomeAPIFunctionResponse += EventHandler1; 

    await CallAPIFunction(...with some parameters...); 

    return myValue; 
} 

private void EventHandler1(sender, args) 
{ 
    // This is the value I want to return in the previous function 
    myValue = args.value; 
} 

在上述myvalue的代碼示例爲空,當我運行該應用程序,因爲事件處理程序代碼踢在函數返回執行之後。

如何在TestPost函數返回之前使事件處理程序異步執行。

請告訴我在這裏可以做些什麼。

回答

2

你究竟想要做什麼?通過調用TestPost.Wait()可以得到MYVALUE的正確值,但這是一個阻塞操作,並將其形成一個UI線程可能會導致死鎖。

如果你想設置一個值函數的結果,它可能是更好的await其結果

var myVar = await TestPost(); 

link介紹一點有關async/await

編輯:

作爲對您評論的迴應,您可以使用TaskCompletionSource來實現您想要的效果。這是未經測試的代碼,但也許是這樣的:

public Task<string> TestPost() 
    { 
     var tcs = new TaskCompletionSource<string>(); 
     // Subscribe to event 
     api.OnSomeAPIFunctionResponse += ((s, e) => tcs.SetResult(args.value)); 

     CallAPIFunction(...with some parameters....); 
     return tcs.Task; 
    } 

那麼你得到的結果是相同的:

var myVar = await TestPost(); 

TaskCompletionSource允許您將舊異步API來使用基於異步模式的任務。這反過來又允許您使用Task Parallel Library提供的功能,並使用.NET 4.5中的新關鍵字asyncawait。它導致更簡單的代碼。您可以從Parallel .NET團隊的Stephen Toub瞭解TaskCompletionSource的更多信息this article

+0

感謝但請閱讀文章我已經說過我訂閱的事件返回結果,而不是實際的功能,它已經等待。我想同時運行事件和事件處理程序,所以當TestPost函數返回時它有一個來自事件處理程序參數的值。謝謝:) – ConfusedCoder

+0

我已更新我的帖子,希望有所幫助。 –