5

In the older .Net API version :

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);

It worked.

When i use new .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);

Error : The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.

Refs :

Introducing the 2.0 .NET Driver

Reading and Writing

I want to ask how to insert a new document using .Net Driver 2.0. Thanks.

[Update 1] I tried to implement :

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);            
}

Result : WaitingForActivation. Nothing changed in database. Please help me!

[Update 2 (Solved)] : add tsk.Wait(); It worked ! Thanks this post : How would I run an async Task method synchronously?

4 Answers 4

3

Your method should be like

 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);

    }
Sign up to request clarification or add additional context in comments.

4 Comments

i tried as u said. Repository respository = new Repository(); Task tsk = respository.Insert(); Console.WriteLine("State: " + tsk.Status); Result : WaitingForActivation.
Nothing changed in database ! I dont know why. I never used async or task before so i dont know why. Can u help me ?
ya sure but do one thing please make sure your connection is working fine I mean you can fetch the data from mongo ? because async and await is nothing but it's just free your main thread
Tks for your help! i add : tsk.Wait();. It worked. Hmm! Im really bad at synchronise.
3
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();

// From here on, your record/document should be in the MongoDB.

Comments

0

You can find in MongoDB C# driver meta file that all function declared without async which is required by await keyword and causes:

Error : The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.

You can just delete the await key word. It works for me

Comments

0

The reason you saw nothing on the database at first was because you didn't wait (await) for Insert method to finish, which you later did by calling task.Wait(). As mentioned in comment in the link to the answer you provided, calling .Wait() like that can cause deadlock. Instead, you should call await Repository.Insert().

Check out this post about await-async http://blog.stephencleary.com/2012/02/async-and-await.html

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.