# 同步Sync和異步Async ??? ### 同步(Synchronous): **同步**的意思是,當你在執行某個工作時,你**必須等這個工作完成**才能繼續做下一件事情。所有的工作都是**依序進行**的,沒有重疊。 例子: 想像你正在餐廳點餐,廚師開始為你準備餐點。你必須**等待廚師做完菜**,才能繼續做其他事情。這段等待時間內,你不能做其他的事,因為你只能等。 程式碼中的同步: 在同步程式碼中,當你呼叫一個方法(例如讀取檔案或從伺服器取得資料),你必須等這個方法完全執行完畢,程式才會繼續往下執行。 ``` // 假設這是一個同步方法 string data = GetDataFromServer(); // 程式會等資料從伺服器傳回來才繼續 Console.WriteLine("Data received: " + data); ``` ### 異步(Asynchronous): **異步**則是讓你可以在執行某個工作時,**不需要等待它完成**,你可以**同時做其他的事**情。工作之間可以同時進行或交錯進行,這樣可以節省時間。 例子: 同樣的餐廳例子,你點完餐後,廚師開始準備你的餐點,但**你不需要等廚師做完菜**才能做其他事。你可以同時滑手機、聊天等。一旦廚師完成菜餚,他會通知你,你再去拿餐點。 程式碼中的異步: 在異步程式碼中,當你呼叫一個方法(例如發送網路請求),你不需要等它完成,可以繼續做其他事情,當它完成時,程式會回來處理結果。 ``` // 使用 async 和 await 來實現異步操作 public async Task GetDataAsync() { Task<string> task = GetDataFromServerAsync(); // 發送請求,但不等結果馬上繼續 Console.WriteLine("Doing something else while waiting for data..."); string data = await task; // 等待資料回傳,回來繼續處理 Console.WriteLine("Data received: " + data); } ``` ### 簡單總結: * 同步: 你做一件事,必須等這件事完成才能做下一件事。就像排隊等餐,你要等上菜才能繼續吃飯。 * 異步: 你做一件事,不需要等它完成,可以繼續做其他事情。當這件事完成後,它會通知你。就像在等餐的同時,你可以滑手機或聊天,等菜好了再去吃。 異步操作通常用在網路請求、檔案操作等耗時的工作上,這樣可以讓程式在等待的同時繼續執行其他部分,提升效率。 # 異步下的task await 學習 Task 和 await 時,可以把它們想像成你請朋友幫你完成一件事的過程。 ### 生活化比喻 假設情境: 想像你正在家裡做飯,你需要讓你的朋友(朋友叫小明)去超市買一些食材。你跟小明說你要什麼,然後讓他去買。 1. 請求: 當你告訴小明你需要哪些食材時,就像是在程式碼中發送了一個請求。這個過程可以看作是一個 Task,它代表一個正在進行的工作。 2. 等待: 小明離開去超市,你在等待他回來。在這段時間內,你可以做其他事情,比如準備其他菜。這就像是在程式碼中使用 await,你在等待 Task 完成,但你不會停止其他操作。 3. 完成: 當小明回來時,你會得到你需要的食材,你可以繼續做飯了。這就是當 Task 完成後,程式碼繼續執行的部分。 ### 程式碼中的例子 用 C# 來看這個過程: 1. 創建一個 Task: 就像是你請小明去超市買食材。這個 Task 代表了這個買食材的過程。 ``` public Task<string> BuyIngredientsAsync() { // 模擬去超市買食材的過程 return Task.Run(() => { // 模擬花費時間的工作 Thread.Sleep(2000); // 模擬花2秒鐘買食材 return "Ingredients bought!"; }); } ``` 2. 使用 await 來等待: 當你等小明回來時,await 就是讓你在這段時間內做其他事情,而不會阻塞整個程式。 ``` public async Task CookDinnerAsync() { // 請小明去超市買食材 Task<string> task = BuyIngredientsAsync(); // 同時,你可以做其他事情,比如準備其他菜 Console.WriteLine("Preparing other parts of the meal..."); // 等待小明買好食材 string result = await task; // 食材買好了,你可以繼續做晚餐 Console.WriteLine(result); Console.WriteLine("Cooking the dinner..."); } ``` ### 總結 * Task 是一個代表某個工作正在進行的對象。在例子中,它就像是你請小明去超市買食材的過程。 * await 是讓你可以等待這個工作完成而不會阻塞主執行緒的關鍵字。在你等小明的過程中,你可以做其他事情,直到他回來。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up