【发布时间】: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