更改长时间运行的可等待任务的参数



我有一个长时间运行的异步方法,它根据传递给此方法的参数进行计算。

它看起来有点像这样:

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第一种方法更干净,我的投票是取消并重新启动操作。

最新更新