Пожалуйста, объясните синтаксис события таймера асинхронно / ожидайте

Я исследовал асинхронность и жду синтаксисаВот а такжеВот, Это действительно помогает понять использование, но я нашел интригующий пример синтаксиса наMSDN чего я просто не понимаю

ВопросМожет кто-нибудь объяснить мне синтаксис этогоSystem.Timers.Timer регистрация события с асинхронным ожиданием: почему вы можете использоватьasync await ключевые слова уже в лямбда-выражении?

Timer timer = new Timer(1000);
timer.Elapsed += async ( sender, e ) => await HandleTimer();

private Task HandleTimer()
{
    Console.WriteLine("\nHandler not implemented..." );        
}

Вопрос 2: И каковы два параметраsender & e хорошо, если они не появляются вHandleTimer метод?

 Jonesopolis07 июн. 2016 г., 15:15
Люди любят прыгать на поезде upvote / downvote довольно быстро. Я бы сказал, что в будущем, попробуйте объяснить, чтоименно так ты не понимаешь Буквально какая часть выражения.
 Mong Zhu07 июн. 2016 г., 15:03
Я думаю, что лямбда-синтаксис меня запутал
 Mong Zhu07 июн. 2016 г., 15:06
Могут ли люди, пожалуйста, объяснить отрицательные голоса, чтобы избежать этого в будущем?
 Jonesopolis07 июн. 2016 г., 14:40
это просто анонимный метод, объявленный с использованием лямбда-синтаксиса. Это также бывает асинхронным. Какая часть вас смущает?

Ответы на вопрос(3)

Код, который вы дали, является анонимной функцией, написанной как лямбда-выражение.

Так что на самом деле происходит то, что для прошедшего события таймера вы назначаете EventHandler какasync ( sender, e ) => await HandleTimer();.

что означает что-то вроде

timer.Elapsed += AnonFunc;

async void AnonFunc(object sender, EventArgs e)
{
    await HandleTImer();
}

Кажется, что лямбда сбивает тебя с толку.

 Mong Zhu07 июн. 2016 г., 15:09
да, я не знал, что можно использовать эти ключевые слова уже в лямбда-строке.
Решение Вопроса

Он назначает асинхронную лямбдуElapsed событиеtimer, Вы можете понять асинхронную лямбду следующим образом: во-первых, лямбда-выражение следующее:

(sender, e) => HandleTimer()

эта лямбда зоветHandleTimer синхронно. Затем добавляем ожидание звонкаHandleTimer асинхронно:

(sender, e) => await HandleTimer()

но это не сработает, потому что для вызова чего-либо асинхронно вы сами должны быть асинхронными, поэтомуasync ключевое слово:

async (sender, e) => await HandleTimer()
 Patrick Hofman07 июн. 2016 г., 15:11
@MongZhuasync (sender, e) => await HandleTimer(sender, e)
 Mong Zhu07 июн. 2016 г., 15:19
хорошо, что на самом деле выглядит всеобъемлющим. Это будет означать, что еслиHandleTimer не будет параметров, тогда событие может быть только внутри класса, я прав?
 Mong Zhu07 июн. 2016 г., 15:05
это отличное объяснение. Теперь я понял, и два параметраsender а такжеe входные параметры дляHandleTimer метод.
 Mong Zhu07 июн. 2016 г., 15:12
Интересно, я собираюсь редактировать свой вопрос

Это просто асинхронныйлямбда-выражение, Это эквивалентно:

timer.Elapsed = CallHandleTimer;

async void CallHandleTimer(object sender, EventArgs e)
{
    await HandleTimer();
}

Ваш ответ на вопрос