最初にコーディングします。これは私がやろうとしていることです。私は近くにいますが、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){...}
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);
}
これを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
を渡すことができます。