2016-06-23 34 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());