gpt4 book ai didi

c# - C#计时器2同时执行的 Action

转载 作者:行者123 更新时间:2023-12-03 13:21:50 25 4
gpt4 key购买 nike

任何人都可以帮助转换/提供如何将以下代码转换为同时使用两个单独的计时器同时运行的两个功能的框架。

public void Controller()
{
List<int> totRand = new List<int>();
do
{
Thread.Sleep(new TimeSpan(0,0,0,1));
totRand.Add(ActionA());
} while (true);

do
{
Thread.Sleep(new TimeSpan(0,0,0,30));
ActionB(totRand);
totRand = new List<int>();
} while (true);
}

public int ActionA()
{
Random r = new Random();
return r.Next();
}

public void ActionB(List<int> totRand)
{
int total = 0;

//total = add up all int's in totRand

Console.WriteLine(total / totRand.Count());
}

显然,上面的方法永远行不通,但原理是一种方法每1秒运行一次,将一些数据添加到列表中。

另一个操作也运行在计时器上,并采取此列表中可能包含的所有内容并对其执行某些操作,然后清除该列表。 (不必担心列表的内容在我执行此操作时会发生变化)。我已经阅读了大量的教程和示例,但是完全无法理解我该如何去做。有什么想法/提示吗?

最佳答案

要间隔一定时间同时运行两个 Action ,可以使用System.Threading.Timer

private readonly Timer _timerA;
private readonly Timer _timerB;

// this is used to protect fields that you will access from your ActionA and ActionB
private readonly Object _sharedStateGuard = new Object();

private readonly List<int> _totRand = new List<int>();

public void Controller() {
_timerA = new Timer(ActionA, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
_timerB = new Timer(ActionB, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
}

private void ActionA(object param) {
// IMPORTANT: wrap every call that uses shared state in this lock
lock(_sharedStateGuard) {
// do something with 'totRand' list here
}
}

private void ActionB(object param) {
// IMPORTANT: wrap every call that uses shared state in this lock
lock(_sharedStateGuard) {
// do something with 'totRand' list here
}
}

在您的问题上下文中,共享状态将是您要在两个操作中操作的列表: totRand

关于c# - C#计时器2同时执行的 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7040062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com