2016-04-20 19 views
12

Aslında MongoDB hakkında daha fazla şey öğrenmeye çalışırken gece başladım, ama asılıyordum ve .NET beklemede/async şeyler. MongoDB'nin site'da gösterilen kodu uygulamaya çalışıyorum. Biraz değiştirmek zorunda kaldım, bu yüzden programımı derlemek için alabilirim. Biliyorum benim konsol uygulamam aşağıdaki.Neden bir async yönteminde kodda hata ayıklayamıyorum?

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 
    } 

Uygulamayı çalıştırdığınızda, ayıklayıcı sırayla GetData() yöntem haline çağrıları benim GetDataAsync() yöntem haline arayacak. "Using (var cursor = collection.FindAsync (filter))" komutunu kullanarak satırı alır ve sonra main() yöntemini tamamlamak için hemen döner.

GetDataAsync() yöntemine koyduğum herhangi bir kesme noktası gibi, o satırın altına koyduğum herhangi bir kesme noktası yok sayılır. Program çıktığı için bu kod çalıştırılmıyor mu? Birisi bana neler olduğunu açıklayabilir mi?

cevap

16

GetDataAsync yönteminizi beklemiyoruz. İlk await'a ulaşıldığında, iş parçacığı iş parçacığına döndürülür. Görevin tamamlanmasını beklemediğinizden, konsol uygulamanızdan çıkışınız ve kesme noktanıza ulaşılamıyor. Ayrıca, geçersiz bir değer yerine Task döndürmek için GetDataAsync yöntemini güncelleştirmeniz gerekir. Boşluğu bekleyemezsin. Etkinlik işleyicisinden başka bir şey için avoid using async void'u kullanmalısınız.

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

Bunu denedim, ancak "Operator" un bir derleme hatası ile sonuçlandım. 'void' türü işlenene uygulanamaz " – Dave

+0

Cevabımı güncelledim, tamam olmalı :) –

+0

Harika! şimdi çalışıyor. Yardım ettiğin için teşekkür ederim! – Dave

İlgili konular