[英]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.