下面我們通過一個.NET Core控制台項目,來展示如何使用異步lambda表達式來初始化三種委托實例:Func<Task<TResult>>、Func<Task>、Action
我們還展示了如何將Main函數改造為異步函數。
using System; using System.Threading.Tasks; namespace NetCoreAsyncDelegate { class Program { //注意Main函數可以通過返回Task類型,來添加async關鍵字成為異步函數,但是如果Main函數返回void,是不能夠成為異步函數的,.NET編譯器會直接報錯 static async Task Main(string[] args) { //構造一個Func<Task<int>>委托實例,使用異步lambda表達式來初始化Func<Task<int>>委托實例,要構造異步lambda表達式,只需要在lambda表達式前面加上async關鍵字,然后在表達式中使用await關鍵字進行異步等待即可,由於Func<Task<int>>委托要求返回一個Task<int>對象,所以和異步函數類似,我們在lambda表達式中返回了一個整數100 Func<Task<int>> delegateFuncTaskReturn = async () => { await Task.Delay(1000); return 100; }; //使用await關鍵字,異步等待Func<Task<int>>委托實例執行完畢 int returnedValue = await delegateFuncTaskReturn(); Console.WriteLine("delegateFuncTaskReturn has been done and returned value {0}", returnedValue); //構造一個Func<Task>委托實例,使用異步lambda表達式來初始化Func<Task>委托實例,要構造異步lambda表達式,只需要在lambda表達式前面加上async關鍵字,然后在表達式中使用await關鍵字進行異步等待即可,由於Func<Task>委托要求返回一個Task對象,所以和異步函數類似,我們在lambda表達式中不返回任何值 Func<Task> delegateFuncTaskNoReturn = async () => { await Task.Delay(1000); }; //使用await關鍵字,異步等待Func<Task>委托實例執行完畢 await delegateFuncTaskNoReturn(); Console.WriteLine("delegateFuncTaskNoReturn has been done"); //構造一個Action委托實例,使用異步lambda表達式來初始化Action委托實例,要構造異步lambda表達式,只需要在lambda表達式前面加上async關鍵字,然后在表達式中使用await關鍵字進行異步等待即可,由於Action委托的返回類型為void,所以和異步函數類似,我們在lambda表達式中不返回任何值 Action delegateActionTask = async () => { await Task.Delay(1000); Console.WriteLine("delegateActionTask has been done"); }; //由於Action委托實例不返回Task或Task<TResult>對象,所以它無法在Main函數中使用await關鍵字來進行異步等待,所以Main函數無法直接得知Action委托實例是否執行完畢 delegateActionTask(); Console.WriteLine("Press any key to end..."); Console.ReadKey(); } } }
希望上面的例子對大家有所幫助~