C# Can';t等待异步扩展方法

C# Can';t等待异步扩展方法,c#,.net,extension-methods,async-await,c#-5.0,C#,.net,Extension Methods,Async Await,C# 5.0,情况非常简单——我编写了一个扩展方法,并使其与返回类型Task异步。但当我尝试使用await调用它时,编译器抛出了一个错误,这表明扩展方法根本没有被识别为异步的。 这是我的密码: public static async Task<NodeReference<T>> CreateWithLabel<T>(this GraphClient client, T source, String label) where T: class { va

情况非常简单——我编写了一个扩展方法,并使其与返回类型
Task
异步。但当我尝试使用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");
公共静态异步任务CreateWithLabel(此GraphClient客户端,T源,字符串标签),其中T:class
{
var节点=client.Create(源);
var url=string.Format(ConfigurationManager.AppSettings[configKey]+“/node/{0}/labels”,node.Id);
var serializedLabel=string.Empty;
使用(var tempStream=new MemoryStream())
{
新的DataContractJsonSerializer(label.GetType()).WriteObject(tempStream,label);
serializedLabel=Encoding.Default.GetString(tempStream.ToArray());
}
var bytes=Encoding.Default.GetBytes(序列化标签);
使用(var webClient=new webClient())
{
添加(“内容类型”、“应用程序/json”);
Add(“Accept”,“application/json;charset=UTF-8”);
等待webClient.UploadDataTaskAsync(url,“POST”,字节);
}
返回节点;
}
var newNode=await client.CreateWithLabel(新任务(),“任务”);
确切的错误消息如下:

“await”运算符只能在异步方法中使用。考虑将该方法标记为“AsiNC”修饰符并将其返回类型改为“任务”< /P>
我是做错了什么还是语言/编译器的限制

错误消息非常清楚:调用扩展方法的方法应标记为
async

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

public async Task MyCallingMethod()
{    
    string result = await "hi".MyExtension();
}
public Task MyExtension(此字符串为s){…}
公共异步任务MyCallingMethod()
{    
字符串结果=等待“hi”.MyExtension();
}
现在重读这一部分应该更有意义了:


“wait”运算符只能在异步方法中使用。”

请发布代码。提示:如果您遵循,其他开发人员将更容易使用您的
异步方法。我明白了。下次会更加注意。@dcastro,您可能需要更改
MyCallingMethod
的签名以返回
任务
void
仅适用于异步事件处理程序。@Noseratio我不同意,还有很多其他情况下您需要“触发并忘记”行为。不过,我会编辑我的帖子,只是因为经验较少的用户可能会对
async void
@dcastro的结果感到惊讶,我也不同意有很多。我很想了解除了(这里显然不是这样)之外的任何有用的场景。服务可能希望触发一个方法并触发一些业务逻辑,但会尽快返回到客户机。您不必总是等待方法的结果。也许“足够”这个词有点太多了,但是说“void只适合异步事件处理程序”也不正确。