【发布时间】:2016-06-25 09:25:58
【问题描述】:
请参阅下面的编辑问题
我有以下问题。
我从无法更改呼叫的组件收到通知事件:
Subject.Save();
我的代码有一个事件处理程序来捕获组件中触发的通知事件。 事件处理程序已正确注册。
我收到的通知带有事件源和SomeEventArgsargs。
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 条路径,然后将它们全部显示出来
10 在由 ShowDisplay() 打开的单个表单中。因此,无法从 myEventHandler 调用 ShowDisplay,因为该事件仅处理单个主题的通知。
我想有一个全局列表并用每个通知的路径填充它,但它引入了全局变量,而且我不知道列表何时填充了所有 10 个路径。这似乎不是一个优雅的想法。
已编辑问题 我正在调用异步方法来获取产品的名称,例如
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>
【问题讨论】:
-
该库中某个类型的某些实例将触发该事件。您需要使用该实例注册一个事件处理程序。从您的问题中不清楚您将如何获得该实例。
-
在
Save()上触发的event的名称是什么?假设是Saved,你需要做myObject.Saved += handler_name_here。除非知道事件细节,否则这里不可能提及事件处理程序的签名。 -
我更新了我的帖子。谢谢
-
您需要更新的代码不止于此。如果您对事件的了解有限,
myObject在哪里声明/初始化,那么您为什么要在这里浪费时间? 987654338@做一些阅读解释和例子.. -
在研究了一下之后,我想出了其他方法来做我需要做的事情,但我遇到了另一个问题。我已经修改了我的问题以反映我现在面临的问题。感谢所有回复的人。
标签: c# asynchronous async-await task