为什么我不能在异步方法中调试代码?

Dav*_*ave 26 c# asynchronous mongodb

我实际上开始尝试了解有关MongoDB的更多信息,但是我已经挂断了.NET等待/异步的东西.我正在尝试实现MongoDB 网站上显示的代码.我不得不稍微修改它,所以我可以让我的程序编译.我知道有以下我的控制台应用程序.

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
}
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序时,调试器将调用我的GetDataAsync()方法,该方法又调用GetData()方法.它到达"using(var cursor = await collection.FindAsync(filter))"行,然后立即返回以完成main()方法.

我放在该行下面的任何断点都被忽略,我在GetDataAsync()方法中放置的断点也是如此.此代码是否因为程序退出而无法运行?有人可以向我解释发生了什么事吗?

Fab*_*NET 35

因为你不等你的GetDataAsync方法.当第一个await到达时,线程返回给调用者.由于您没有等待任务完成,因此未达到控制台应用程序退出和断点.您还需要更新GetDataAsync方法以返回Task而不是void.你无法等待无效.除了事件处理程序之外,您应该避免使用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
}
Run Code Online (Sandbox Code Playgroud)


Luk*_*uke 6

我不太擅长异步开发,并且遇到了类似的问题,但是我正在启动异步方法,如下所示Main

Task.Run(async () => await GetDataAsync());
Run Code Online (Sandbox Code Playgroud)

我认为垃圾收集器正在处理匿名方法,因为没有任何东西再引用它。使用 Fabien.Wait()可以让我逐步完成程序并进行调试。我正在使用 netcore 2.1 和 vs2017