2016-04-20 17 views
12

Tôi thực sự đã bắt đầu một đêm cố gắng tìm hiểu thêm về MongoDB, nhưng tôi đang bị treo lên và các công cụ .NET đang chờ đợi/không đồng bộ. Tôi đang cố gắng triển khai mã hiển thị trên site của MongoDB. Tôi đã phải sửa đổi nó một chút chút, vì vậy tôi có thể nhận được chương trình của tôi để biên dịch. Tôi biết có ứng dụng bảng điều khiển sau của tôi.Tại sao tôi không thể gỡ lỗi mã bằng một phương thức không đồng bộ?

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 
    } 

Khi tôi chạy ứng dụng, trình gỡ lỗi sẽ gọi vào phương thức GetDataAsync() của nó để gọi phương thức GetData(). Nó được đưa vào dòng "using (var cursor = await collection.FindAsync (filter))" và sau đó ngay lập tức trả về để kết thúc phương thức main().

Bất kỳ điểm ngắt nào tôi đặt bên dưới dòng đó đều bị bỏ qua, cũng như bất kỳ điểm ngắt nào tôi đặt trong phương thức GetDataAsync(). Có phải mã này không được chạy vì chương trình thoát không? Ai đó có thể giải thích cho tôi chuyện gì đang diễn ra không?

Trả lời

16

Vì bạn không đợi phương thức GetDataAsync của mình. Khi lần đầu tiên await đạt đến, luồng được trả lại cho người gọi. Vì bạn không chờ đợi để hoàn thành nhiệm vụ, thoát khỏi ứng dụng giao diện điều khiển của bạn và điểm ngắt của bạn không đạt được. Bạn cũng sẽ cần cập nhật phương thức GetDataAsync để trả lại Task thay vì hủy. Bạn không thể chờ đợi được. Bạn nên avoid using async void cho bất kỳ điều gì khác ngoài trình xử lý sự kiện.

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

Tôi đã thử điều đó, nhưng tôi vừa kết thúc với lỗi biên dịch là "Toán tử". không thể được áp dụng cho toán hạng của loại 'void' " – Dave

+0

Tôi đã cập nhật câu trả lời của mình, nó phải là ok :) –

+0

Tuyệt vời! nó hiện đang hoạt động. Cảm ơn bạn đã giúp đỡ! – Dave

Các vấn đề liên quan