C# 保持状态以提高性能
我有一个类,它根据变量的状态计算一些结果C# 保持状态以提高性能,c#,C#,我有一个类,它根据变量的状态计算一些结果 class CalculateService { public int Num1; public int Num2; public void Num1Updated(int num1, Action<int> callback) { var result = TimeConsumingFunction(Num1, Num2); callback(
class CalculateService
{
public int Num1;
public int Num2;
public void Num1Updated(int num1, Action<int> callback)
{
var result = TimeConsumingFunction(Num1, Num2);
callback(result;)
}
public void Num2Updated(int num2, Action<int> callback)
{
var result = TimeConsumingFunction(Num1, Num2);
callback(result;)
}
}
问题是:如果Field1和Field2在短时间内发生更改,则调用TimeConsumingFunction两次是浪费时间的。我如何解决这个问题
也许我可以在调用TimeConsumingFunction之前等待几毫秒
注意,这里简化了问题。这里有两个以上的领域事件方法似乎不是最好的策略。我会选择在一个方便的时间间隔内使用计时器启动计划计算 在实际启动计算之前,您可以随时检查数据是否已更改,以缓存上一个刻度上的值。如果数据相同,只需不做任何事情,等待下一个滴答声出现 优点:只有在数据丢失时才调用TimeConsumingFunction 改变。 缺点:用户界面不会实时更新,但是 根据时间间隔,用户实际上不必注意到 差别
因为看起来值实际上随着每次调用而改变,所以在TimeConsumingFunction一侧进行缓存是不实际的,因为如果使用以前的值,将返回不正确的结果 所以一个解决方案是从UI中提取数据,而不是将其推送到UI。这样你就有一个地方来限制通话 比如:
ExternalData.Field1.Changed( _ => ScheduleUpdate());
bool calculationInProgress = false;
bool updatePending = false;
void ScheduleUpdate()
{
updatePending = true;
if (calculationInProgress)
{
return;
}
calculationInProgress = true;
updatePending = false;
service.ComputeAll(num1, num2,
() =>
{
calculationInProgress = false;
UpdateUI();
if (updatePending)
{
ScheduleUpdate();
}
});
}
使用缓存。请看,取消是不可能的
ExternalData.Field1.Changed( _ => ScheduleUpdate());
bool calculationInProgress = false;
bool updatePending = false;
void ScheduleUpdate()
{
updatePending = true;
if (calculationInProgress)
{
return;
}
calculationInProgress = true;
updatePending = false;
service.ComputeAll(num1, num2,
() =>
{
calculationInProgress = false;
UpdateUI();
if (updatePending)
{
ScheduleUpdate();
}
});
}