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

C# 更改长时间运行的等待任务的参数,c#,async-await,C#,Async Await,我有一个长时间运行的异步方法,它根据我传递给这个方法的参数进行计算 看起来有点像这样: public async Task<Measurement> StartMeasurementAsync( int duration, int nbr, double parameter,

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

看起来有点像这样:

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;
}
public异步任务StartMeasurementAsync(
整数持续时间,
国际丁腈橡胶,
双参数,
我在进步,
取消令牌(取消令牌)
{
测量=新测量{参数=参数};
对于(int i=0;i
基本上,这个方法是在我的UI中调用的,我使用进程刷新原始数据的可视化表示,用户可以更改参数。此参数与在方法中传递的参数相同

在for循环中等待之后调用的数据处理也在UI中调用,以便用户可以看到更改此参数将对原始数据产生的“实时”结果。但是,我需要告诉长时间运行的任务参数已更改,以便将其正确保存在
测量中


这就是我遇到的问题,我如何才能告诉任务此参数已更改?

这可以与使用
HttpClient
异步下载网页进行比较

假设您发起了一些web请求。一段时间后,用户出于某种原因对请求的页面不感兴趣,而对其他页面感兴趣,您通常会取消请求并启动新请求

你不能说,嘿,现在我对新页面感兴趣,在操作开始并进行了一半之后。你必须取消它并开始新的

同样的逻辑也适用于此。您必须取消异步操作并启动新操作。似乎您已经在长时间运行的方法中支持取消。所以我想取消以前的操作并开始新的操作并不是什么大不了的事

或者,您可以将一个可变对象作为参数传递给
StartMeasurementAsync
,并在需要更改时对其进行变异(通过适当的同步)。然后轮询更改,或者实现某种更改通知(比如
INotifyPropertyChanged
),并在异步方法中采取相应的行动


在我看来,第一种方法是更干净的,我投票赞成取消并重新启动操作。

按照字面意思解释你的要求,你可以传递一个
ref
param,但是从另一个线程更改ref参数会导致数据损坏。我认为您应该取消现有任务,并使用新参数启动新任务。如果您调用async方法根据参数进行计算,并且该参数在计算过程中可能会发生变化,你不应该重新开始计算吗?@BenRobinson AFAIK你不能使用
ref
async
方法开始计算。我不需要(也不想)取消整个过程,因为这个参数在我的所有“数据”之间共享,如果它发生变化,可以重新计算这个数据。参数保存在
测量
级别,但我没有从UI更新当前运行的
测量
的引用。@SriramSakthivel可能是一个很好的选项,您当时无法执行;-)很遗憾,我不能取消这次手术。我需要保存中间结果并保留它们,即使用户取消了操作。更改此参数不会像更改web请求的URI那样更改整个逻辑,它只是用于某些计算的一个次要参数。我的回答中描述的替代方法是否有帮助?或我不确定您的代码是做什么的,以及它如何依赖于传入的参数。因此,我无法提供代码帮助:(我尝试传递一个可变对象,但似乎遇到了一些并发性问题。您能给我一些关于“正确同步”的线索吗?@Gimly你应该在访问可变对象时使用锁。这很棘手,如果你能提供一些示例代码来解释你打算如何使用它,我会尽力提供帮助。看一看,事实上,我找到了一个更好的解决方案,我正在传递该参数,并在任务完成后进行计算。最终这会更有意义我不冒任何并发问题的风险,所以我的问题是空的。