2016-04-20 34 views
12

私は実際にMongoDBについてもっと学びたいと思って夜を始めましたが、ハングアップして、.NETが待っている/非同期のものです。私は、MongoDBのsiteに示されているコードを実装しようとしています。私はちょっと修正する必要があったので、私のプログラムをコンパイルすることができました。私は次のコンソールアプリケーションを持っていることを知っています。非同期メソッドでコードをデバッグできないのはなぜですか?

protected static IMongoClient _client; 
    protected static IMongoDatabase _database; 

    static void Main(string[] args) 
    { 
     _client = new MongoClient(); 
     _database = _client.GetDatabase("test"); 

     GetDataAsync(); 
    } 

    private static async void GetDataAsync() //method added by me. 
    { 
     int x = await GetData(); 
    } 

    private static async Task<int> GetData() 
    { 
     var collection = _database.GetCollection<BsonDocument>("restaurants"); 
     var filter = new BsonDocument(); 
     var count = 0; 
     Func<int> task =() => count; //added by me. 
     var result = new Task<int>(task); //added by me. 
     using (var cursor = await collection.FindAsync(filter)) //Debugger immediately exits here, goes back to main() and then terminates. 
     { 
      while (await cursor.MoveNextAsync()) 
      { 
       var batch = cursor.Current; 
       foreach (var document in batch) 
       { 
        // process document 
        count++; 
       } 
      } 
     } 

     return count; //added by me 
    } 

私はアプリケーションを実行すると、デバッガは順番にGetDataメソッド()メソッドを呼び出し、私のGetDataAsync()メソッドを呼び出します。 "using(var cursor = await collection.FindAsync(filter))"という行に移動し、すぐにmain()メソッドを終了します。

私がその行の下に置いたブレークポイントは、GetDataAsync()メソッドに設定したブレークポイントと同様に無視されます。プログラムが終了するので、このコードは実行されませんか?誰かが何が起こっているか私に説明することはできますか?

答えて

16

あなたのGetDataAsyncメソッドが待機していないためです。最初のawaitに達すると、スレッドは呼び出し元に返されます。タスクの完了を待たずに、コンソールアプリケーションの終了とブレークポイントには到達していません。 GetDataAsyncメソッドを更新して、voidではなくTaskを返す必要があります。あなたは空を待つことはできません。イベントハンドラ以外の場合はavoid using async voidにする必要があります。

protected static IMongoClient _client; 
protected static IMongoDatabase _database; 

static void Main(string[] args) 
{ 
    _client = new MongoClient(); 
    _database = _client.GetDatabase("test"); 

    GetDataAsync().Wait(); 
    // Will block the calling thread but you don't have any other solution in a console application 
} 

private static async Task GetDataAsync() //method added by me. 
{ 
    int x = await GetData(); 
} 

private static async Task<int> GetData() 
{ 
    var collection = _database.GetCollection<BsonDocument>("restaurants"); 
    var filter = new BsonDocument(); 
    var count = 0; 
    Func<int> task =() => count; //added by me. 
    var result = new Task<int>(task); //added by me. 
    using (var cursor = await collection.FindAsync(filter)) //Debugger immediately exits here, goes back to main() and then terminates. 
    { 
     while (await cursor.MoveNextAsync()) 
     { 
      var batch = cursor.Current; 
      foreach (var document in batch) 
      { 
       // process document 
       count++; 
      } 
     } 
    } 

    return count; //added by me 
} 
+0

私はそれを試みましたが、私はちょうど "オペレータ 'のコンパイルエラーで終了します。 'void'型のオペランドには適用できません " – Dave

+0

私は自分の答えを更新しました。それは大丈夫です。 –

+0

素晴らしい!それは今働いている。ご協力いただきありがとうございます! – Dave

関連する問題