使用InsertOneAsync(.NET Driver 2.0)插入新文档

时间:2015-04-13 06:51:52

标签: c# asp.net mongodb mongodb-.net-driver mongodb-csharp-2.0

在较旧的.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

Reading and Writing

我想问一下如何使用.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?

4 个答案:

答案 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

的帖子