检查函数在x秒内执行了多少次?c#

本文关键字:多少次 执行 函数 检查 | 更新日期: 2023-09-27 17:58:26

我想检查我的函数在x秒内执行了多少次,比如3秒。我看到了一个类似但没有完全解决问题的堆栈示例。。

事实上,我正在处理AUTOMATION UI,我的事件被执行了很多次,所以我有一个解决方案,我将对话的名称传递给我的函数,并需要检查在接下来的3-4秒内执行的相同函数是否相同时,相同的名称是否传递给函数。如果是,我将返回我的事件处理程序,所以这是我的事件自动化UI 代码

Automation.AddAutomationEventHandler(
    WindowPattern.WindowOpenedEvent,
    AutomationElement.RootElement,
    System.Windows.Automation.TreeScope.Subtree,
    (sender, e) =>
    {
        string  dialogueName = sd.Current.Name;
        if (element.Current.LocalizedControlType == "Dialog")
        {
            starttimer(dialogueName );//how to get returned value there
        }
    }
});

功能代码

public static nameRecent;
public bool checkerfunctionOFname(string name )
{
    if (nameRecent==name)
    {
        return;
    }
}

原因我需要定时器3-4秒,因为假设用户打开一个保存为对话框,但在10秒后关闭,然后再次打开,因此这与之前打开的静态名称相匹配,但当他打开保存为对话框时,它会在3秒内以相同的名称重复,因此如果功能再次执行是3秒,则返回false等

代码的解决方案,但当函数返回false时安排它如何在事件处理程序中获取它,或者如何停止它的主函数以返回

     public static string  globalfucntiontime;
    public static string globalfucntionname;
    int _counter = 0;
    Timer timer;
  public void  starttimer(string name){
  _counter = 0;
  timer = new Timer();
  timer.Interval = 1000;
  timer.Tick += (sender, args) =>
        TimerEventProcessor(name);   //how to get its returned value
    globalfucntiontime = _counter.ToString();
    timer.Start();

 }
 private bool  TimerEventProcessor(string name)
   {
  globalfucntionname = name; 
  if (_counter <= 3 && name == globalfucntionname)
  {
      return false;
  }
  else if (name !=  globalfucntionname)
  {

  }
   globalfucntiontime = _counter.ToString();
   _counter += 1;
  return true;
}

检查函数在x秒内执行了多少次?c#

将名称和调用时间戳存储到字典中。现在你可以问字典,这个名字是不是在最后n秒内被调用的。

public class Foo
{
    private readonly IDictionary<string,int> lastcalled = new Dictionary<string,int>();
    public void RegisterCallOf( string name )
    { 
        int now = Environment.TickCount;
        if ( lastcalled.ContainsKey( name ) )
            lastcalled[name] = now;
        else
            lastcalled.Add( name, now );
    }
    public bool WasCalledDuringLast( string name, int milliseconds )
    {
        int now = Environment.TickCount;
        if ( lastcalled.ContainsKey( name ) )
          return now - lastcalled[name] <= milliseconds;
        return false; 
    }
}

使用示例

// check if that "bar" was already called within the last 3000ms
if ( !foo.WasCalledDuringLast( "bar", 3000 ) )
{
    // it was not, so now we register this call
    foo.RegisterCallOf( "bar" );
    // and now call that bar method
}

更新

为了更容易使用,您可以使用扩展该类

public void ExecuteIfWasNotCalledDuringLast( string name, int milliseconds, Action action )
{
    if ( !WasCalledDuringLast( name, milliseconds ) )
    {
        RegisterCallOf( name );
        action();
    }
}

你将使用这种方法

foo.ExecuteIfWasNotCalledDuringLast( "bar", 3000, barAction );