无法等待异步扩展方法

che*_*r89 5 .net c# extension-methods async-await c#-5.0

情况非常简单 - 我写了一个扩展方法,并使其与返回类型异步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");
Run Code Online (Sandbox Code Playgroud)

确切的错误信息是这样的:

'await'运算符只能在异步方法中使用.考虑使用'async'修饰符标记此方法并将其返回类型更改为'Task'

我做错了什么或是语言/编译器限制?

dca*_*tro 19

该错误消息是相当清楚的:该方法在那里你调用扩展方法应该被标记为async.

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

public async Task MyCallingMethod()
{    
    string result = await "hi".MyExtension();
}
Run Code Online (Sandbox Code Playgroud)

现在重读这部分应该更有意义:

"'await'运算符只能异步方法中使用."

  • @dcastro,您可能想要更改`MyCallingMethod` 的签名以返回`Task`,`void` 仅适用于异步事件处理程序。 (2认同)
  • 例如,记录.服务可能希望触发方法并触发某些业务逻辑,但尽快返回客户端.你_always_不需要等待方法的结果.也许"充足"这个词有点过分,但是说"虚空只对异步事件处理程序有好处"也不正确. (2认同)