Сначала код. Вот что я пытаюсь сделать. Я'близок, но думаю, что мне просто нужно исправить то, как я'определил свой параметр в методе 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){...}
.
private async void UpdateButton(Func<Task<bool>> post)
{
if (!await post())
ErrorBox.Text = "Error posting message.";
}
--EDIT--
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>
немедленно, и вам нужно сохранить его как передачу лямбды, то все еще нет причин для того, чтобы лямбда была async. В этом случае вы можете использовать:
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
напрямую.