2015-06-19 51 views
1

我有一個Windows服務,它從SQL Server讀取數據並將它們寫入MongoDB。MongoDB CountAsync和光標不能在Windows服務中使用新的驅動程序

我試圖使這個服務適應新的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驅動程序有一些限制?

回答

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

此問題與同步上下文和異步/避免方法有關。
你有地方運行長時間運行的任務,這個代碼應該被替換。
Use one of this approaches for running background task由Scott Hanselman描述。

您可以快速檢查和至少可以肯定在的問題根源下一方式:

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

而更換避免任務 - public async Task UpdateExternalPage()

相關問題