Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保持状态以提高性能_C# - Fatal编程技术网

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();
                }
          });
   }