キーワードがないのはどうですか?
たいていの場合、非同期メソッドを呼び出すときに、その結果が必要であることをコンパイラに認識してもらいたいです。
Document doc = DownloadDocumentAsync();
それでおしまい。人々がこのことのキーワードを考えるのに苦労しているのは、それが「物事が完全に正常であるならあなたがすることをする」というキーワードを持つようなものだからです。これがデフォルトであり、キーワードは不要です。
更新
最初に、コンパイラが型推論を使用して賢くなり、何をすべきかを考えるべきだと提案しました。これについてさらに考えると、CTPの既存の実装はそのままにしておきますが、await
キーワードを明示的に使用する必要がある場合を減らすために、いくつかの簡単な追加を行います。
次の属性を作成します[AutoAwait]
。これはメソッドにのみ適用できます。これをメソッドに適用する1つの方法は、マークすることasync
です。しかし、手でそれをすることもできます、例えば:
[AutoAwait]
public Task<Document> DownloadDocumentAsync()
次に、async
メソッドの内部で、コンパイラはの呼び出しを待機することを前提とするDownloadDocumentAsync
ため、指定する必要はありません。そのメソッドを呼び出すと、自動的に待機します。
Document doc = DownloadDocumentAsync();
さて、「賢い」とを取得しTask<Document>
たい場合、演算子を使用しますstart
。これはメソッド呼び出しの前にのみ表示できます:
Task<Document> task = start DownloadDocumentAsync();
きちんとした、私は思う。現在、単純なメソッド呼び出しは、通常の意味を意味します。メソッドが完了するまで待機します。そしてstart
、何か違うことを示しています。待つな。
async
メソッドの外部に表示されるコードの場合、[AutoAwait]
メソッドを呼び出すことができる唯一の方法は、プレフィックスをに付けることstart
です。これにより、async
メソッドに表示されるかどうかに関係なく、同じ意味を持つコードを書く必要があります。
それから私は貪欲になり始めます!:)
まず、async
インターフェイスメソッドに適用したいです。
interface IThing
{
async int GetCount();
}
基本的に、実装メソッドはを返さなければならないTask<int>
か、に互換性のあるものでなければならずawait
、メソッドの呼び出し元は[AutoAwait]
振る舞います。
また、上記のメソッドを実装するとき、次のように書きたいと思います。
async int GetCount()
したがってTask<int>
、戻り値の型として言及する必要はありません。
また、async
デリゲート型(結局、1つのメソッドを持つインターフェイスのようなもの)にも適用したいと思います。そう:
public async delegate TResult AsyncFunc<TResult>();
async
デリゲートは持っています-あなたはそれを推測- [AutoAwait]
行動。async
メソッドから呼び出すことができ、自動的にawait
編集されます(start
それを選択しない限り)。だからあなたが言うなら:
AsyncFunc<Document> getDoc = DownloadDocumentAsync;
それはうまくいきます。メソッド呼び出しではありません。タスクはまだ開始されていません-はタスクではありませんasync delegate
。タスクを作成するための工場です。あなたは言うことができます:
Document doc = getDoc();
そして、それはタスクを開始し、それが終了して結果を与えるのを待ちます。または、あなたは言うことができます:
Task<Document> t = start getDoc();
このため、「配管」が漏れる1つの場所は、async
メソッドへのデリゲートを作成する場合、async delegate
型を使用することを知っている必要があるということです。ですから、代わりに、とFunc
言う必要がありますAsyncFunc
。ある日、そのようなことは改善された型推論によって修正されるかもしれませんが。
もう1つの質問は、通常の(非同期ではない)メソッドで開始すると言うとどうなるかです。明らかに、コンパイルエラーは安全なオプションです。しかし、他の可能性もあります。