C#中如何使用異步lambda表達式來初始化委托實例


下面我們通過一個.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();
        }
    }
}

希望上面的例子對大家有所幫助~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM