我有一个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窗体应用程序做同样的事情,那就没问题了!但我需要在Windows服务中使用此代码。有人知道我的实现是错误的还是使用新的MongoDB驱动程序有一些限制?
答案 0 :(得分:1)
我将代码更改为以下内容:
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;
答案 1 :(得分:0)
此问题与同步上下文和异步/避免方法的问题有关 您有运行长时间运行任务的地方,应该替换此代码 {3}由Scott Hanselman描述。
您可以快速检查并至少确定问题的来源:
protected void OnStart(string[] args)
{
ThreadPool.QueueUserWorkItem(async x => await UpdateExternalPage();
}
将免费替换为任务 - public async Task UpdateExternalPage()
。