Учитывая, что вы используете .NET Framework 4.7.1 , вы, возможно, захотите использовать C # 7.1 в своем проекте и использовать async Main()
.Это приводит к значительному чистому коду без каких-либо уродливых GetResult()
/ Result
/ Sleep
/ Task.Delay
.
например
class Program
{
// Specify C# 7.1 in the project's Properties.Build.Advanced.Language Version field
// in order to use 'static async Task Main'
static async Task Main(string[] args) // <--- Note the async Task
{
Console.WriteLine("Sleeping for 3 seconds");
// the await prevents the app from exiting prematurely
await Task.Delay(TimeSpan.FromSeconds(3));
}
}
Если вы получитеошибка компиляции, вам может потребоваться принудительное использование C # 7.1:
![enter image description here](https://i.stack.imgur.com/I0oJ2.jpg)
Итак, в вашем случае измените код на:
static async Task Main(string[] args)
{
await doSomeStuff();
}
public static async Task doSomeStuff() // <--- make it Task so it can be await'ed
{
var connString = "Server=localhost;User ID=root;Password=password;Database=mysql";
using (var conn = new MySqlConnection(connString))
{
await conn.OpenAsync();
using (var cmd = new MySqlCommand("SELECT host FROM mysql.user", conn))
using (var reader = await cmd.ExecuteReaderAsync())
while (await reader.ReadAsync())
Console.WriteLine(reader.GetString(0));
}
Console.WriteLine("Finished!");
Console.ReadKey();
}
async void
Хотя предупреждение Махлатсе о async void
имеет преимущество, оно не относится к вашей конкретной проблеме, из-за которой приложение преждевременно закрывается из-за не ожидает выполнения задач , в отличие от приложения, преждевременно завершающего работу из-за , исключение выдается из async void
метода .Предполагая, что единственное различие между вашим синхронным кодом и асинхронным кодом заключается в async
, а не в соединениях с базой данных, ваш код должен не быть ошибочным.