传递一个* Awaitable *匿名函数作为参数(Passing an *Awaitable* A

2019-09-22 13:00发布

代码第一。 这就是我想要做的事。 我很接近,但我想我只是需要修复我的UpdateButton方法定义我的参数的方式。

private async void UpdateButton(Action<bool> 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()不起作用,因为,“类型‘无效’是不是awaitable。” 所以,问题是,我怎么定义这个方法来支持awaitable参数我参数?

下面是TwitterAction()后()如何定义?

public virtual async Task<bool> Post(string messageId){...}

Answer 1:

private async void UpdateButton(Func<Task<bool>> post)
{
    if (!await post())
        ErrorBox.Text = "Error posting message.";
}

- 编辑 -

UpdateButton(()=>Post("ss"));

private async void UpdateButton(Func<Task<bool>> post)
{
    if (!await post())
        this.Text = "Error posting message.";
}

public virtual async Task<bool> Post(string messageId)
{
    return await Task.Factory.StartNew(() => true);
}


Answer 2:

您需要将这个作为Task<bool> ,不是一个Action<bool>

这提供东西是“awaitable”。

我相信这会工作,鉴于你目前的代码:

private async Task UpdateButtonAsync(Task<bool> post)
{
    if (!await post)
        ErrorBox.Text = "Error posting message.";
}

// This will work if Post returns Task<bool> in the current API...
private void PostToTwitter()
{
    UpdateButtonAsync(new TwitterAction().Post("Hello, world!"));
}

如果你不想启动Task<bool>立即,并需要保持它作为传递一个lambda,仍然没有理由拉姆达是异步。 在这种情况下,你可以使用:

private async Task UpdateButtonAsync(Func<Task<bool>> post)
{
    if (!await post())
        ErrorBox.Text = "Error posting message.";
}

// This will work if Post returns Task<bool> in the current API...
private void PostToTwitter()
{
    UpdateButtonAsync(() => new TwitterAction().Post("Hello, world!"));
}

这将导致拉姆达返回Task<bool> (无async / await必需的,因为Post已经返回Task<bool> ),并运行该拉姆达的更新方法。

就个人而言,我觉得第一个选项(上面)更简单,并怀疑它更可能是你想要的东西。 鉴于你已经API返回Task<T>你可以传递周围, await其直接。



文章来源: Passing an *Awaitable* Anonymous Function as a Parameter