【问题标题】:C# Getting async list errorC# 获取异步列表错误
【发布时间】: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&lt;System.Collections.Generic.List&lt;string&gt;&gt; 隐式转换为System.Collections.Generic.List&lt;string&gt;

【问题讨论】:

  • 该库中某个类型的某些实例将触发该事件。您需要使用该实例注册一个事件处理程序。从您的问题中不清楚您将如何获得该实例。
  • Save() 上触发的event 的名称是什么?假设是Saved,你需要做myObject.Saved += handler_name_here。除非知道事件细节,否则这里不可能提及事件处理程序的签名。
  • 我更新了我的帖子。谢谢
  • 您需要更新的代码不止于此。如果您对事件的了解有限,myObject 在哪里声明/初始化,那么您为什么要在这里浪费时间? 987654338@做一些阅读解释和例子..
  • 在研究了一下之后,我想出了其他方法来做我需要做的事情,但我遇到了另一个问题。我已经修改了我的问题以反映我现在面临的问题。感谢所有回复的人。

标签: c# asynchronous async-await task


【解决方案1】:

List&lt;string&gt; productNames = GetProductNamesAsync(); 必须是List&lt;string&gt; productNames = await GetProductNamesAsync();,但是你真的不应该为同步函数制作异步包装器。做List&lt;string&gt; productNames = await Task.Run(() =&gt; GetProductNames());

会好很多

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多