kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 jedmao
jedmao
Вопрос

Передача *допустимой* анонимной функции в качестве параметра

Сначала код. Вот что я пытаюсь сделать. Я'близок, но думаю, что мне просто нужно исправить то, как я'определил свой параметр в методе 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){...}.

31 2012-09-17T19:40:38+00:00 2
 jedmao
jedmao
Редактировал вопрос 17-го сентября 2012 в 7:52
Программирование
asynchronous
c#
lambda
parameter-passing
Решение / Ответ
 L.B
L.B
17-го сентября 2012 в 7:45
2012-09-17T19:45:06+00:00
Дополнительно
Источник
Редактировать
#17230234
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);
}
 L.B
L.B
Редактировал ответ 3-го июля 2016 в 9:14
37
0
Reed Copsey
Reed Copsey
17-го сентября 2012 в 7:43
2012-09-17T19:43:46+00:00
Дополнительно
Источник
Редактировать
#17230233

Вы должны передать это как 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 напрямую.

Reed Copsey
Reed Copsey
Редактировал ответ 17-го сентября 2012 в 8:03
14
0
Похожие сообщества 6
Microsoft Stack Jobs
Microsoft Stack Jobs
2 414 пользователей
Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks
Открыть telegram
С#
С#
2 330 пользователей
Стараемся не флудить. Пишем по делу. Правила: https://t.me/professorweb/430450 Для флуда @svoboda_obsh
Открыть telegram
CODE BLOG / C#
CODE BLOG / C#
1 772 пользователей
Чат для .NET разработчиков и C# программистов. По всем вопросам: @shwanoff Youtube-канал: https://youtube.com/codeblog Основной канал: @codeblog Вконтакте: https://vk.com/codeblog Правила: https://t.me/codeblog_csharp/246972 Вакансии по тегу #work
Открыть telegram
var chat = new Chat();
var chat = new Chat();
1 428 пользователей
Обсуждение вопросов по .NET Правила чата – https://blog.devdigest.today/chat-rules Чат для флуда – https://t.me/+zwxI91RGG6s2YzAy
Открыть telegram
C#/.NET Для Новичков
C#/.NET Для Новичков
289 пользователей
Группа создана для тех, кто изучает язык программирования C#. Верховный главнокомандующий: @BlackDeveloper Оффтоп - разрешен в меру, реклама - бан.
Открыть telegram
ext
ext
31 пользователей
Общение на темы YouTube канала и программирования. Вакансии не размещаем. Основной канал: @extremecode
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 5 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией