3

在较旧的 .Net API 版本中:

MongoClient client = new MongoClient();
var server = client.GetServer();
var db = server.GetDatabase("foo");
var collection = db.GetCollection<BsonDocument>("bar");
var document = new BsonDocument { { "_id", 1 }, { "x", 2 } };
collection.Save(document);

有效。

当我使用新的 .Net Driver 2.0 时:

var client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("foo");
var collection = database.GetCollection<BsonDocument>("bar");

var document = new BsonDocument { { "_id", 1 }, { "x", 2 } };
await collection.InsertOneAsync(document);

错误:“等待”运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法并将其返回类型更改为“任务”。

参考:

介绍 2.0 .NET 驱动程序

读写

我想问一下如何使用.Net Driver 2.0 插入一个新文档。谢谢。

[更新 1] 我试图实现:

public class Repository
{
    public static async Task Insert()
    {
        var client = new MongoClient("mongodb://localhost:27017");
        var database = client.GetDatabase("foo");
        var collection = database.GetCollection<BsonDocument>("bar");

        var document = new BsonDocument { { "_id", 1 }, { "x", 2 } };
        await collection.InsertOneAsync(document);
    }
}

static void Main(string[] args)
{            
       Task tsk = Repository.Insert();
       tsk.Wait();
       Console.WriteLine("State: " + tsk.Status);            
}

结果:等待激活。数据库中没有任何变化。请帮我!

[更新 2(已解决)]:添加 tsk.Wait(); 有效 !感谢这篇文章:我将如何同步运行异步任务方法?

4

4 回答 4

3

你的方法应该像

 public async void Insert()
    {
         var client = new MongoClient("mongodb://localhost:27017");
        var database = client.GetDatabase("foo");
        var collection = database.GetCollection<BsonDocument>("bar");

        var document = new BsonDocument { { "_id", 1 }, { "x", 2 } };
        await collection.InsertOneAsync(document);

    }
于 2015-04-13T07:01:50.477 回答
2
var client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("foo");
var collection = database.GetCollection<BsonDocument>("bar");

var document = new BsonDocument { { "_id", 1 }, { "x", 2 } };
Task task = collection.InsertOneAsync(document);
task.Wait();

// 从这里开始,您的记录/文档应该在 MongoDB 中。

于 2015-10-29T10:15:22.173 回答
0

起初您在数据库中什么都看不到的原因是因为您没有等待(等待)Insert方法完成,后来您通过调用task.Wait(). 正如您提供的答案链接中的评论所述,像这样调用 .Wait() 可能会导致死锁。相反,您应该调用await Repository.Insert().

查看这篇关于等待异步的帖子http://blog.stephencleary.com/2012/02/async-and-await.html

于 2017-05-30T08:50:10.010 回答
0

您可以在 MongoDB C# 驱动程序元文件中找到所有声明的函数都没有async它是await关键字所需的,原因是:

错误:“等待”运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法并将其返回类型更改为“任务”。

您可以删除await关键字。这个对我有用

于 2015-09-18T09:57:41.767 回答