2016-06-07 67 views
1

我研究了異步並等待語法herehere。它真的有助於理解使用情況,但我發現了一個令人感興趣的語法示例MSDN,我只是不明白。請解釋定時器事件異步/等待語法

問題: 可能有人請向我解釋這個System.Timers.Timer事件註冊的語法與非同步等待: 爲什麼你可以使用asyncawait關鍵字已經在lambda表達式?

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

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

問題2: 什麼是兩個參數sender & e好,如果他們不出現在HandleTimer方法?

+1

它只是一個使用lambda語法聲明的匿名方法。它也恰好是異步的。你對哪個部分感到困惑? – Jonesopolis

+0

我認爲lambda語法讓我感到困惑 –

+1

請問人們能否解釋downvotes以避免它在未來? –

回答

5

它指定一個異步拉姆達到Elapsed事件timer。你可以理解爲異步拉姆達是這樣的:首先,下面是一個lambda:

(sender, e) => HandleTimer() 

這拉姆達調用HandleTimer同步。然後,我們添加一個的await調用HandleTimer異步:

(sender, e) => await HandleTimer() 

但是這不會起作用,因爲異步調用的東西,你必須是異步的自己,因此async關鍵字:

async (sender, e) => await HandleTimer() 
+0

這是一個很好的解釋。現在我明白了,並且'sender'和'e'這兩個參數是'HandleTimer'方法的輸入參數。 –

+0

@MongZhu'async(sender,e)=>等待HandleTimer(發送者,e)' –

+0

有趣我要編輯我的問題 –

2

這只是一個異步的lambda expression。這相當於:

timer.Elapsed = CallHandleTimer; 

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

你的代碼給出的是一個匿名函數,寫成lambda表達式。

所以真正發生的事情是,對於計時器已過的事件,您將EventHandler分配爲async (sender, e) => await HandleTimer();

它轉換爲類似

timer.Elapsed += AnonFunc; 

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

看來,這是一個的跳閘您的拉姆達。

+0

是的,我不知道可以在lambda行中使用這些關鍵字。 –