5

状況は非常に単純です。拡張メソッドを作成し、戻り値の型で async にしましたTask<T>。しかし、await を使用して呼び出そうとすると、拡張メソッドが非同期としてまったく認識されなかったことを示すエラーがコンパイラによってスローされます。これが私のコードです:

public static async Task<NodeReference<T>> CreateWithLabel<T>(this GraphClient client, T source, String label) where T: class
    {
        var node = client.Create(source);
        var url = string.Format(ConfigurationManager.AppSettings[configKey] + "/node/{0}/labels", node.Id);
        var serializedLabel = string.Empty;
        using (var tempStream = new MemoryStream())
        {
            new DataContractJsonSerializer(label.GetType()).WriteObject(tempStream, label);
            serializedLabel = Encoding.Default.GetString(tempStream.ToArray());
        }
        var bytes = Encoding.Default.GetBytes(serializedLabel);

        using (var webClient = new WebClient())
        {
            webClient.Headers.Add("Content-Type", "application/json");
            webClient.Headers.Add("Accept", "application/json; charset=UTF-8");
            await webClient.UploadDataTaskAsync(url, "POST", bytes);
        }

        return node;
    }


var newNode = await client.CreateWithLabel(new Task(), "Task");

正確なエラー メッセージは次のとおりです。

「await」演算子は、非同期メソッド内でのみ使用できます。このメソッドを「async」修飾子でマークし、戻り値の型を「Task」に変更することを検討してください

私は何か間違ったことをしていますか、それとも言語/コンパイラの制限ですか?

4

1 に答える 1

22

エラー メッセージは非常に明確です。拡張メソッド呼び出しているメソッドは としてマークする必要がありますasync

public Task<string> MyExtension(this string s) { ... }

public async Task MyCallingMethod()
{    
    string result = await "hi".MyExtension();
}

この部分を読み直すと、今ではもっと理にかなっているはずです。

「'await' 演算子は非同期メソッド内でのみ使用できます。」

于 2013-11-01T13:40:04.967 に答える