2016-06-23 37 views
-1

查閱EDITED問題下方C#獲取異步列表錯誤

我有以下問題。

我收到通知事件從組件我不能改變的呼叫:

Subject.Save(); 

我的代碼有一個事件處理程序來捕獲在組件觸發的通知事件。 事件處理程序已正確註冊。

我收到的通知攜帶了事件源和SomeEventArgs參數。

SomeEventArgs向我提供包含我需要的ID的數據。像

private void myEventHandler(object source, SomeEventArgs e) 
{ 
    string path = e.getData().getPath(); 
    ... 
    ... 
    ShowDisplay(); //display shows a form with the path in a grid 
} 

的東西時,我救一個主題,我有一個通知,並從其SomeEventArgs我可以得到 路徑,我需要。所以這很好。

問題是當我想保存多個主題。對於每個主題的Save(),myEventHandler最終將被解僱,並且我將獲得如上所述的路徑。

問題是我不想爲每個單獨的主題調用ShowDisplay(),而是一次調用所有主題。所以,如果我有10個主題,我想首先接收10個路徑,然後在由ShowDisplay()打開的單個窗體中顯示它們全部的所有 10。因此,ShowDisplay不能從myEventHandler中調用,因爲該事件僅處理單個主題的通知。

我認爲有一個全局列表,並填充每個通知的路徑,但引入了全局變量,加上我不知道列表中是否填滿了所有10個路徑。這似乎不是一個優雅的想法。

EDITED問題 我打電話異步方法獲得的產品的名稱,如

List<string> productNames = GetProductNamesAsync(); 

我的異步方法是這樣的:

public async Task<List<string>> GetProductNamesAsync() 
{ 
    return await Task.Run(() => subject.GetList()); 
} 

這將返回錯誤 不能隱含轉換型System.Threading.Tasks.Task<System.Collections.Generic.List<string>>System.Collections.Generic.List<string>

+4

該庫中的某個類型的某個實例將觸發該事件。您需要爲該實例註冊一個事件處理程序。從你的問題來看,你不清楚你將如何掌握這一實例。 – Will

+0

它在'Save()'上觸發的'event'的名稱是什麼?假設它是'Saved',你需要做'myObject.Saved + = handler_name_here'。事件處理程序的簽名在這裏是不可能提及的,除非已知事件詳細信息。 – niksofteng

+0

我更新了我的帖子。謝謝 – cd491415

回答

0

List<string> productNames = GetProductNamesAsync();需要是List<string> productNames = await GetProductNamesAsync();,但是你真的不應該爲同步函數製作異步封裝。這樣做好得多List<string> productNames = await Task.Run(() => GetProductNames());