38

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

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

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

4

2 に答える 2

50
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);
}
于 2012-09-17T19:45:06.670 に答える
17

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>(no async/ awaitrequired、Postすでに返されているようにTask<bool>)を返し、updateメソッドはラムダを実行します。

個人的には、最初のオプション(上記)の方が簡単で、あなたが望むものである可能性が高いと思います。APIがすでに返されている場合は、それを直接Task<T>渡すことができます。await

于 2012-09-17T19:43:46.873 に答える