2013-01-07 3 views
5

ための拡張メソッドを実装することで、私は拡張メソッドは配列を待つ。配列

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

を実装することにより、配列awaitableを作りたかったのですが、IntelliSenseには、「(awaitable)mytype[]」を言うにもかかわらず、

を使用した場合、コンパイラは私にエラーを与えます
mytype[] t = new mytype[] { new mytype(), new mytype() }; 
await t; 

mytypeの単一のオブジェクトでawaitを呼び出すと正常に動作します。何故ですか?私は何か間違っているのですか?ご協力いただきありがとうございます。

+0

非同期呼び出しでawaitが使用されていますが、なぜ型でそれを使用していますか? – prthrokz

+1

どのようなエラーが表示されますか? –

+1

目次:['TaskCompletionSource '](http://msdn.microsoft.com/en-us/library/dd449174.aspx)を使用すると、自分で待ち受けるクラスを実装するよりも優れているようです:http://stackoverflow.com/質問/ 6731815/asyncctp-creating-a-class-that-is-iswaiaitable –

答えて

3

これはコンパイラのバグだと思います。report itです。

私はこのコードは(、ないカスタムタイプTaskTaskAwaiterを使用して)動作しないことを確認することができます

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

Task[] tasks = …; 
await tasks; 

(これは、エラーが発生し「] [」System.Threading.Tasks.Taskを待つことはできません。

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

IEnumerable<Task> tasks = …; 
await tasks; 

Interes:「」、報告されたように)

しかしIEnumerableアレイを交換する(方法とローカルの両方では)作業を行いますひょっとしたら、固定バージョンでは、配列を直接待つのはまだ動作しません。しかし、例えば、IListが待ち受けているとうまくいきます。

+0

あなたの助言に従って報告しました(https://connect.microsoft.com/VisualStudio/feedback/details/775990/await-array-by-implementing-extension-method-for-array-does-not-compileを参照) 。あなたの調査努力に感謝します。 – David

関連する問題