web-dev-qa-db-ja.com

非同期メソッドでコードをデバッグできないのはなぜですか?

私は実際に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
}
_

アプリケーションを実行すると、デバッガーはGetDataAsync()メソッドを呼び出し、次にGetData()メソッドを呼び出します。行using (var cursor = await collection.FindAsync(filter))に到達すると、すぐに戻り、main()メソッドを終了します。

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

25
Dave

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