更改长时间运行的可等待任务的参数
本文关键字:等待 任务 参数 长时间 运行 | 更新日期: 2023-09-27 18:34:02
我有一个长时间运行的异步方法,它根据传递给此方法的参数进行计算。
它看起来有点像这样:
public async Task<Measurement> StartMeasurementAsync(
int duration,
int nbr,
double parameter,
IProgress<IntermediateResults> progress,
CancellationToken cancellationToken)
{
Measurement measurement = new Measurement { Parameter = parameter };
for(int i = 0; i < nbr; i++)
{
var rawData = await RunMeasurement(duration, progress, cancellationToken);
var treatedData = DataTreatment.Treat(rawData, parameter);
measurement.Data.Add(treatedData);
cancellationToken.ThrowIfCancellationRequested();
}
return measurement;
}
基本上,此方法在我的UI中调用,我正在使用进度刷新原始数据的可视表示形式,用户可以为其更改参数。此参数与在方法中传递的参数相同。
在 for 循环中的 await 之后调用的数据处理也会在 UI 中调用,以便用户可以"实时"看到更改此参数将对原始数据产生的结果。但是,我需要告诉长时间运行的任务参数已更改,以便将其正确保存在Measurement
中。
这就是我卡住的地方,我怎么能告诉任务这个参数已经改变?
这可以与异步下载网页进行比较,例如使用 HttpClient
.
假设您发起了某个 Web 请求。一段时间后,用户由于某种原因对请求的页面不感兴趣,而对其他页面感兴趣,您通常会取消请求并启动新请求。
你不能说嘿,现在我对手术开始后的新页面感兴趣,并且走了一半。您必须取消它并开始新的。
同样的逻辑在这里适用。您必须取消异步操作并启动新操作。您似乎已经在长时间运行的方法中支持取消。所以我想取消以前的操作并开始新的操作没什么大不了的。
或者,您可以将可变对象作为参数传递,以便在需要更改它时对其进行StartMeasurementAsync
和更改(通过适当的同步(。然后轮询更改,或实现某种更改通知(例如INotifyPropertyChanged
(,并在异步方法中采取相应的操作。
IMO第一种方法更干净,我的投票是取消并重新启动操作。