Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待数组;通过实现数组的扩展方法_C#_Async Await - Fatal编程技术网

C# 等待数组;通过实现数组的扩展方法

C# 等待数组;通过实现数组的扩展方法,c#,async-await,C#,Async Await,我想通过实现一个扩展方法使数组成为可等待的 public static IAwaitable GetAwaiter(this mytype[] t) { return t.First().GetAwaiter(); } 但即使IntelliSense说“(等待)mytype[]”,编译器在使用 mytype[] t = new mytype[] { new mytype(), new mytype() }; await t; 在mytype的单个对象上调用wait效果很好。为什么呢?

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

public static IAwaitable GetAwaiter(this mytype[] t)
{
    return t.First().GetAwaiter();
}
但即使IntelliSense说“(等待)
mytype[]
”,编译器在使用

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

在mytype的单个对象上调用wait效果很好。为什么呢?我做错什么了吗?谢谢您的帮助。

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

我可以验证此代码是否无效(使用
任务
任务等待者
,而不是自定义类型):

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

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

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

IEnumerable<Task> tasks = …;
await tasks;
publicstatictaskawaiter-getwaiter(此IEnumerabletasks)
{
返回任务。First().GetAwaiter();
}
IEnumerable tasks=…;
等待任务;

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

waiting用于异步调用,为什么要将其用于类型?会出现什么错误?顺便说一句:使用似乎比自己实现一个可等待的类要好:不幸的是,错误消息只是“无法等待'mytyope[]”。谢谢你给我指出
TaskCompletionSource
,但有一些特殊要求…@prthrokz他可能会遵循。我听从了你的建议并报告了(请参阅)。谢谢你的调查工作。
public static TaskAwaiter GetAwaiter(this IEnumerable<Task> tasks)
{
    return tasks.First().GetAwaiter();
}

IEnumerable<Task> tasks = …;
await tasks;