传递* Awaitable *匿名函数作为参数
代码优先。 这就是我想要做的。 我很接近,但我想我只需要修改我在UpdateButton方法中定义参数的方式。
private async void UpdateButton(Action post) { if (!await post()) ErrorBox.Text = "Error posting message."; } private void PostToTwitter() { UpdateButton(async () => await new TwitterAction().Post("Hello, world!")); } private void PostToFacebook() { UpdateButton(async () => await new FacebookAction().Post("Hello, world!")); }
不幸的是, !await post()
不起作用,因为“Type’void’是不可行的。” 所以问题是,如何在此方法中定义我的参数以支持等待参数?
这是TwitterAction()。Post()的定义方式……
public virtual async Task Post(string messageId){...}
private async void UpdateButton(Func> post) { if (!await post()) ErrorBox.Text = "Error posting message."; }
– 编辑 –
UpdateButton(()=>Post("ss")); private async void UpdateButton(Func> post) { if (!await post()) this.Text = "Error posting message."; } public virtual async Task Post(string messageId) { return await Task.Factory.StartNew(() => true); }
您需要将其作为Task
传递,而不是Action
。
这提供了“等待”的东西。
鉴于您当前的代码,我相信这会有效:
private async Task UpdateButtonAsync(Task post) { if (!await post) ErrorBox.Text = "Error posting message."; } // This will work if Post returns Task in the current API... private void PostToTwitter() { UpdateButtonAsync(new TwitterAction().Post("Hello, world!")); }
如果您不想立即启动Task
,并且需要将其保持为传递lambda,则仍然没有理由让lambda异步。 在这种情况下,您可以使用:
private async Task UpdateButtonAsync(Func> post) { if (!await post()) ErrorBox.Text = "Error posting message."; } // This will work if Post returns Task in the current API... private void PostToTwitter() { UpdateButtonAsync(() => new TwitterAction().Post("Hello, world!")); }
这会导致lambda返回Task
(没有async
/ await
需要,因为Post
已经返回Task
),以及运行lambda的update方法。
就个人而言,我发现第一个选项(上面)更简单,并怀疑它更可能是你想要的。 鉴于您的API已经返回Task
,您可以直接传递它并直接await
它。
上述就是C#学习教程:传递* Awaitable *匿名函数作为参数分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/985154.html