MongoDB CountAsync和游标不能在Windows服务中使用新的驱动程序

我有一个Windows服务,从SQL Server读取数据,并将其写入MongoDB。

我试图将这个服务调整到新的MongoDB驱动程序(使用2.0.1版本),但我面临一些问题。

我有这个:

protected void OnStart(string[] args) { threadExternalPage = new Thread(new ThreadStart(FacadeFactory.GetLivePrice.UpdateExternalPage)); 

这段代码调用这个方法。

  public async void UpdateExternalPage() { while (true) { MongoUpdateProductBO mongo = new MongoUpdateProductBO(); await mongo.UpdateExternalPage(); } } 

现在的问题是:每次我在mongo.UpdateExternalPage()上调用这一行

 var count = await collection.CountAsync(new BsonDocument()); 

该方法退出而不处理下一个指令。

同样的事情发生,如果我执行这一行:

 using (var cursor = await collection.Find(filter).ToCursorAsync()) 

但是如果我使用Windows Forms应用程序做同样的事情,那就没有问题了! 但是我需要这个代码在Windows服务中工作。 有人知道我的实现是错误的还是使用新的MongoDB驱动程序有一些限制?

我将代码更改为以下内容:

  var cursor = collection.Find(filter).ToCursorAsync(); cursor.Wait(); using (cursor.Result) { while (cursor.Result.MoveNextAsync().Result) { 

它按预期工作。

同样的,当我将它改为:

  var temp = collection.CountAsync(new BsonDocument()); temp.Wait(); var count = temp.Result; 

此问题与同步上下文和异步/避免方法的问题有关。
你有你跑长跑任务的地方,这个代码应该被替换。
使用这种方法之一来运行 Scott Hanselman描述的后台任务 。

你可以快速检查,至少可以确定问题的根源:

 protected void OnStart(string[] args) { ThreadPool.QueueUserWorkItem(async x => await UpdateExternalPage(); } 

并将避免替换为任务 – public async Task UpdateExternalPage()