检查函数在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;
}
将名称和调用时间戳存储到字典中。现在你可以问字典,这个名字是不是在最后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 );