Search code examples
c#mongodbasynchronousmongodb-.net-driverdata-access-layer

MongoCollection returns data sync but not async


I've been trying to convert a sync logic to async and realized that my async await pattern doesn't work.

I've changed this code:

var filter = Builders<SmartAgentProperty>.Filter.Where(smartAgent => smartAgent.UserMail==userMail);
var results = await SmartAgentsCollection.FindAsync(filter);
return results.ToList();

to this:

var filter = Builders<SmartAgentProperty>.Filter.Where(smartAgent => smartAgent.UserMail == userMail);
var results = SmartAgentsCollection.Find(smartAgent => smartAgent.UserMail == userMail).ToEnumerable();
return Task.FromResult(results);

the sync version works perfectly.

the async version is hanging and doesn't throw any exceptions.

as it sounds, this is an extremely wierd bug.

I thought I might be doing things wrong but seems like the same pattern works in other places in my code so I'm reaching out for help.


Solution

  • So based on Craig's Comment, issue solved!

    a. I was using it wrong (Task.FromResult instead of actual async implementation)

    b. I was missing the configureAwait(false)

    c. should have used Find(filter).ToListAsync() instead of FindAsync(filter).ToEnumerable()

    here's the code after fixing it:

    return await _smartAgentsCollection
          .Find(smartAgent => smartAgent.UserMail == userMail)
          .ToListAsync().ConfigureAwait(false);