簡體   English   中英

等待后的文本無法以異步void方法打印出來

[英]The text after await cannot be printed out in async void method

最近,我正在學習Task,並且碰巧碰到了異步等待,並且嘗試編寫一個簡單的演示,請幫助檢查我的編碼是否有問題? 以及為什么“ x = ???” 和“ GetDataFromDbAsync結尾”無法在控制台上打印? 如果您能幫助我,我將不勝感激。 非常感謝。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;

namespace ConsoleApplication8
{
    class Program
    {
        static void Main(string[] args)
        {

            Test test = new Test();
            Console.WriteLine("main thread starts...");
            System.Threading.Thread.Sleep(1000);
            test.GetDataFromDb();
            Console.WriteLine("Mainthread end");
            Console.ReadKey();

        }
    }

    class Test
    {
        public void GetDataFromDb()
        {
            Console.WriteLine("GetDataFromDb starts");
            Task.Run(() => GetDataFromDbAsync());
            Console.WriteLine("GetDataFromDb ends");
        }

        public async Task<bool> GetDataFromDbAsync()
        {
            try
            {
                Console.WriteLine("GetDataFromDbAsync starts");
                var x = await ReadingDbAsync();
                Console.WriteLine("x=" + x);
                Console.WriteLine("GetDataFromDbAsync ends");
                return true;
            }
            catch(AggregateException ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
        }

        public Task<int> ReadingDbAsync()
        {
            Console.WriteLine("ReadingDbAsync starts");
            System.Threading.Thread.Sleep(3000);
            var task= new Task<int>(() => 100);
            Console.WriteLine("ReadingDbAsync ends");
            return task;
        }
    }
}

以下是輸出, 演示輸出在這里

輸出如下:

main thread starts...
GetDataFromDb starts
GetDataFromDb end
Mainthread end
GetDataFromDbAsync starts
ReadingDbAsync starts
ReadingDbAsync ends
**BUT WHY NOT SHOW THE FOLLOWING
x=100
GetDataFromDbAsync ends**

您不必await正在GetDataFromDb創建的任務。 結果,在GetDataFromDbAsync await之后,狀態機恢復之前,執行將命中Console.ReadKey 我懷疑如果您按了某個鍵,在應用程序退出之前您會看到兩條丟失的控制台消息。

您需要返回Task GetDataFromDb並確保它已完成:

test.GetDataFromDb().Wait();

另外,請參閱此相關問題

您的問題是您正在使用任務構造函數:

var task= new Task<int>(() => 100);

如果要代表同步值的任務,請使用Task.FromResult

var task = Task.FromResult(100);

正如我在博客上所描述的那樣,永遠不要使用任務構造函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM