使用await foreach删除方法中的async和await

问题描述 投票:0回答:1

我想知道是否可以从该方法中删除await,以免出现异步方法。

public static async Task Run(IMinioClient minio,
        string bucketName = "my-bucket-name",
        string prefix = null,
        bool recursive = true,
        bool versions = false)
    {
        try
        {
            Console.WriteLine("Running example for API: ListObjectsAsync");
            var listArgs = new ListObjectsArgs()
                .WithBucket(bucketName)
                .WithPrefix(prefix)
                .WithRecursive(recursive)
                .WithVersions(versions);
            await foreach (var item in minio.ListObjectsEnumAsync(listArgs).ConfigureAwait(false))
                Console.WriteLine($"Object: {item.Key}");
            Console.WriteLine($"Listed all objects in bucket {bucketName}\n");
        }
        catch (Exception e)
        {
            Console.WriteLine($"[Bucket]  Exception: {e}");
        }
    }

https://github.com/minio/minio-dotnet/blob/master/Minio.Examples/Cases/ListObjects.cs

谢谢您的帮助。

通常我会执行 .Result 来执行此操作,但这里的等待是在 foreach 上完成的

c# async-await minio
1个回答
0
投票

在可以的情况下不使用异步执行是很奇怪的,但我会把它留给你。

如果您确实不需要使用

await
,这里是不使用它的实现。有点冗长,不像
await
那样干净,但就是这样。

首先,让我们定义返回

IAsyncEnumerable
的示例方法:

public static class TestClass
{
    public static async IAsyncEnumerable<int> GetIntsAsync()
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(100);
            yield return i;
        }
    }
}

没有

await
的实现将是:

var asyncEnumerator = TestClass.GetIntsAsync().GetAsyncEnumerator();
try
{
    while (asyncEnumerator.MoveNextAsync().AsTask().GetAwaiter().GetResult())
    {
        Console.WriteLine(asyncEnumerator.Current);
    }
}
finally
{
    asyncEnumerator?.DisposeAsync().AsTask().GetAwaiter().GetResult();
}
© www.soinside.com 2019 - 2024. All rights reserved.