【问题标题】:await array; by implementing extension method for array等待数组;通过实现数组的扩展方法
【发布时间】:2013-01-07 14:35:53
【问题描述】:

我想通过实现一个扩展方法使一个数组可以等待

public static IAwaitable GetAwaiter(this mytype[] t)
{
    return t.First().GetAwaiter();
}

但即使 IntelliSense 说“(等待)mytype[]”,编译器在使用时也会给我一个错误

mytype[] t = new mytype[] { new mytype(), new mytype() };
await t;

在 mytype 的单个对象上调用 await 可以正常工作。这是为什么?难道我做错了什么?感谢您的帮助。

【问题讨论】:

  • await 用于异步调用,你为什么将它与类型一起使用?
  • 你遇到了什么错误?
  • 顺便说一句:使用TaskCompletionSource<T> 似乎比自己实现一个等待类更好:stackoverflow.com/questions/6731815/…
  • 不幸的是,错误消息只是“无法等待'mytyope []'”。感谢您指点我TaskCompletionSource<T>,但有特殊要求...
  • @prthrokz 他可能正在关注this example

标签: c# async-await


【解决方案1】:

我认为这是编译器中的一个错误,您应该report it

我可以验证此代码不起作用(使用 TaskTaskAwaiter,而不是自定义类型):

public static TaskAwaiter GetAwaiter(this Task[] tasks)
{
    return tasks.First().GetAwaiter();
}

Task[] tasks = …;
await tasks;

(据报告,它会产生错误“无法等待'System.Threading.Tasks.Task[]'”。)

但是为IEnumerable(在方法和本地)交换数组确实有效:

public static TaskAwaiter GetAwaiter(this IEnumerable<Task> tasks)
{
    return tasks.First().GetAwaiter();
}

IEnumerable<Task> tasks = …;
await tasks;

有趣的是,在固定版本中,直接等待数组仍然不起作用。但例如等待IList 确实有效。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 2014-04-18
  • 1970-01-01
  • 2013-11-12
  • 2023-03-26
相关资源
最近更新 更多