web-dev-qa-db-ja.com

* Awaitable *匿名関数をパラメーターとして渡す

最初にコーディングします。これは私がやろうとしていることです。私は近くにいますが、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()は機能しません。「タイプ 'void'は待機できないためです。」だから問題は、このメソッドでawaitableパラメータをサポートするためにどのようにパラメータを定義するのですか?

TwitterAction()。Post()の定義方法は次のとおりです...

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

31
jedmao
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);
}
37
L.B

これをTask<bool>ではなくAction<bool>として渡す必要があります。

これは「待ち望まれる」何かを提供します。

あなたの現在のコードを考えると、これはうまくいくと思います:

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>をすぐに開始せず、ラムダを渡すように維持する必要がある場合でも、ラムダが非同期である理由はありません。その場合、以下を使用できます。

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を渡すことができます。

14
Reed Copsey