C# 向MongoDb异步插入实体不工作

C# 向MongoDb异步插入实体不工作,c#,.net,mongodb,asynchronous,C#,.net,Mongodb,Asynchronous,有人能告诉我为什么这个代码不起作用吗?它编译、运行,但Mongo数据库仍然为空。同步进行时,它正在工作 class Program { static void Main(string[] args) { var client = new MongoClient(); var db = client.GetDatabase("Mongo"); var collection = db.GetCollection<User>(

有人能告诉我为什么这个代码不起作用吗?它编译、运行,但Mongo数据库仍然为空。同步进行时,它正在工作

class Program
{
    static void Main(string[] args)
    {
        var client = new MongoClient();
        var db = client.GetDatabase("Mongo");
        var collection = db.GetCollection<User>("Users");

        User user = new User("Denis", "Chang", "China", 21);
        AddUserAsync(user, collection);
    }

    static async void AddUserAsync(User user, IMongoCollection<User> collection)
    {
        await collection.InsertOneAsync(user);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var client=new MongoClient();
var db=client.GetDatabase(“Mongo”);
var collection=db.GetCollection(“用户”);
用户=新用户(“丹尼斯”、“张”、“中国”,21);
AddUserAsync(用户,集合);
}
静态异步void AddUserAsync(用户用户,IMongoCollection集合)
{
等待收集。插入同步(用户);
}
}

该方法是异步的,但您不必等待操作完成。试试这个

static async Task AddUserAsync(User user, IMongoCollection<User> collection)
{
    await collection.InsertOneAsync(user);
}

您不必等待
AddUserAsync
完成。为此,您有两个选择:

  • 使用
    AddUserAsync(用户,集合).GetAwaiter().GetResult()
    ,它将一直阻止,直到异步函数完成
  • 如果您使用的是C#7.1,那么可以使用
    异步Main
    ,如下所示:

    static async Task Main()
    {
        ...
        await AddUserAsync(user, collection);
    }
    
  • 为了使这两种方法都能工作,您还需要更新
    AddUserAsync
    函数以返回
    任务,只需更改签名:

    static async Task AddUserAsync(User user, IMongoCollection<User> collection)
    
    静态异步任务AddUserAsync(用户用户,IMongoCollection集合)
    
    设置是正确的。同步进行时,它工作正常。斯蒂芬·克利里(Stephen Cleary)在这方面写了一篇优秀的文章,你可能会觉得有趣。
    static async Task AddUserAsync(User user, IMongoCollection<User> collection)