Code d'abord. Voilà ce que j'essaie de faire. Je suis proche, mais je pense que j'ai juste besoin de corriger la façon dont j'ai défini mon paramètre dans la méthode 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!"));
}
Malheureusement, la !await post()
ne fonctionne pas car, "Tapez 'void' n'est pas attendue." La question est donc de savoir comment définir mon paramètre dans cette méthode pour prendre en charge un paramètre en attente?
Voici comment TwitterAction (). Post () est défini ...
public virtual async Task<bool> Post(string messageId){...}
private async void UpdateButton(Func<Task<bool>> post)
{
if (!await post())
ErrorBox.Text = "Error posting message.";
}
--ÉDITER--
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);
}
Vous devez le passer en tant que Task<bool>
, pas un Action<bool>
.
Cela fournit quelque chose qui est "attendable".
Je crois que cela fonctionnera, compte tenu de votre code actuel:
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!"));
}
Si vous ne souhaitez pas démarrer le Task<bool>
immédiatement, et il faut le garder comme passant un lambda, il n'y a toujours aucune raison pour que le lambda soit asynchrone. Dans ce cas, vous pouvez utiliser:
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!"));
}
Cela provoque le lambda à renvoyer le Task<bool>
(pas de async
/await
requis, car Post
renvoie déjà Task<bool>
) et la méthode de mise à jour pour exécuter le lambda.
Personnellement, je trouve la première option (ci-dessus) plus simple, et je pense que c'est plus probablement ce que vous voulez. Étant donné que votre API renvoie déjà Task<T>
, vous pouvez simplement le faire circuler et await
directement.