【问题标题】:How to tell when ForEachAsync completes?如何判断 ForEachAsync 何时完成?
【发布时间】:2021-12-04 17:20:48
【问题描述】:

我正在使用 gRpc 流,需要判断 ForEachAsync 循环何时用完元素,以便我可以做其他事情。我该怎么做?

这是我包含循环的方法:

private async Task UpdateProgress(string id)
        {
            CancellationTokenSource cts = new CancellationTokenSource();
            ProgressServiceClient progressClient = new ProgressServiceClient(progressServerAddress);
            ChannelName channelName = new ChannelName() { Id = id };

            var timestamp = Timestamp.FromDateTime(DateTime.UtcNow);

            _ = progressClient.ProgressReports(channelName)
            .ForEachAsync((x) =>
            {
                if (timestamp < x.TimeStamp)
                {
                    UpdateRow(x);
                }
            }, cts.Token);
           
            this.Dispatcher.Invoke(() =>
            {
                if (cts != null && !cts.IsCancellationRequested)
                {
                    Application.Current.Exit += (_, __) => cts.Cancel();
                    this.Unloaded += (_, __) => cts.Cancel();
                }
            });
            await Task.Delay(50);
        }

【问题讨论】:

  • 等待返回的Task而不是丢弃它?
  • 就像@JohanDonne 建议的那样,或者如果您想稍后再查看,请查看Task.IsCompleted
  • 我试过了。除非调用取消令牌取消,否则它似乎永远不会完成。
  • 在这种情况下,您应该检查ProgressReports 方法并找出它永远不会返回的原因。
  • 在对 gRpc 进行了更多研究之后,似乎流的本质是在取消之前保持打开状态,因此循环永远不会返回。

标签: c# asynchronous grpc


【解决方案1】:

你需要在foreach之前等待:

await progressClient.ProgressReports(channelName)
            .ForEachAsync((x) =>
            {
                if (timestamp < x.TimeStamp)
                {
                    UpdateRow(x);
                }
            }, cts.Token);

// all the items returned here proceed with your changes

无需在任何地方分配它,因为您不会对结果做任何事情。

这里的文章对非等待异步任务有一些很好的解释:https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/error-messages/bc42358

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2012-12-04
    • 2013-01-10
    • 1970-01-01
    相关资源
    最近更新 更多