在较旧的.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);
错误:'await'运算符只能在异步方法中使用。 考虑使用'async'修饰符标记此方法并进行更改 它的返回类型为'任务'。
参考:
Introducing the 2.0 .NET Driver
我想问一下如何使用.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);
}
结果:WaitingForActivation。数据库中没有任何变化。请帮我!
[Update 2(Solved)]:添加tsk.Wait();有效 ! 感谢这篇文章:How would I run an async Task method synchronously?
答案 0 :(得分: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);
}
答案 1 :(得分: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中。
答案 2 :(得分:0)
您可以在MongoDB C#驱动程序元文件中找到async
关键字所需的await
所声明的所有函数,并导致:
错误:等待&#39;等待&#39;运算符只能在异步方法中使用。考虑使用&#39; async&#39;标记此方法。修饰符并将其返回类型更改为&#39;任务&#39;。
您只需删除await
关键字即可。它对我有用
答案 3 :(得分:0)
您最初没有在数据库中看到任何内容的原因是因为您没有等待(等待)Insert
方法完成,之后您通过调用task.Wait()
来完成此操作。正如您在提供的答案的链接中的注释中所提到的那样,调用.Wait()会导致死锁。相反,您应该致电await Repository.Insert()
。
查看有关await-async http://blog.stephencleary.com/2012/02/async-and-await.html
的帖子