C# MongoDB CountAsync和游标在具有新驱动程序的Windows服务中不工作
我有一个Windows服务,它从SQL Server读取数据并将其写入MongoDB 我正在尝试将此服务适应新的MongoDB驱动程序(使用2.0.1版本),但我面临一些问题 我有这个:C# MongoDB CountAsync和游标在具有新驱动程序的Windows服务中不工作,c#,windows,mongodb,service,C#,Windows,Mongodb,Service,我有一个Windows服务,它从SQL Server读取数据并将其写入MongoDB 我正在尝试将此服务适应新的MongoDB驱动程序(使用2.0.1版本),但我面临一些问题 我有这个: protected void OnStart(string[] args) { threadExternalPage = new Thread(new ThreadStart(FacadeFactory.GetLivePrice.UpdateExternalPage)); 此代码调用
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()上调用这一行
该方法在不处理下一条指令的情况下退出
如果我执行这一行,也会发生同样的情况:
using (var cursor = await collection.Find(filter).ToCursorAsync())
但是如果我使用Windows窗体应用程序做同样的事情,那就没有问题了!但是我需要这个代码在Windows服务中工作。有人知道我的实现是否错误,或者使用新的MongoDB驱动程序是否有一些限制吗?这个问题与同步上下文和异步/避免方法的问题有关。
您有运行长时间运行任务的地方,应替换此代码。
由斯科特·汉斯曼描述 您可以快速检查并至少确定下一步的问题来源:
protected void OnStart(string[] args)
{
ThreadPool.QueueUserWorkItem(async x => await UpdateExternalPage();
}
并将avoid替换为Task-
public async Task UpdateExternalPage()
我将代码更改为以下内容:
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;
var temp = collection.CountAsync(new BsonDocument());
temp.Wait();
var count = temp.Result;