gpt4 book ai didi

c# - 将变量传递给类中的计时器事件

转载 作者:太空狗 更新时间:2023-10-29 22:16:21 27 4
gpt4 key购买 nike

我在一个类中有一个方法,它从/向 Form1 接收和返回多个参数。我需要使用定时事件来使用这些参数执行一些代码。我已经安排了这个简化的代码来显示动态:

class Motor
{
public static System.Timers.Timer _timer;
int valReg = 30;

public void PID(decimal _actualSpeed, Decimal _speedRequest, out Decimal _pwmAuto, out decimal _preValReg)
{

_timer = new System.Timers.Timer();
_timer.Interval = (3000);
_timer.Elapsed += new System.Timers.ElapsedEventHandler(_timerAutoset);
_timer.Enabled = true;
// {....}
_pwmAuto = valReg;
_preValReg = valReg - 1;
}
static void _timerAutoset(object sender, System.Timers.ElapsedEventArgs e)
{
/* here I need to work with:
_actualSpeed
_speedRequest
_pwmAuto
_preValReg
and send back the last two variables
*/
}
}

这就是我从 Form1 按钮传递和接收变量的方式:

        private void button4_Click(object sender, EventArgs e)
{
// some code ................
Motor mtr = new Motor();
mtr.PID(speedRequest, actualSpeed, out pwmAuto, out xxx);
//..more code

如何将这些参数传递到 _timerAutoset 事件或从中取回这些参数?

最佳答案

我倾向于使用匿名委托(delegate)来解决这个问题。

public void PID(decimal _actualSpeed, Decimal _speedRequest, out Decimal _pwmAuto, out decimal _preValReg)
{
_pwmAuto = valReg;
_preValReg = valReg - 1;

// Because we cannot use [out] variables inside the anonymous degegates,
// we make a value copy
Decimal pwmAutoLocal = _pwmAuto;
Decimal preValRegLocal = _preValReg;

_timer = new System.Timers.Timer();
_timer.Interval = (3000);
_timer.Elapsed += (sender, e) => { HandleTimerElapsed(_actualSpeed, _speedRequst, pwmAutoLocal, preValRegLocal); };
_timer.Enabled = true;
// {....}

}

static void HandleTimerElapsed(Decimal actualSpeed, Decimal speedRequst, Decimal pwmAuto, Decimal preValReg)
{
// (...)
}

(当委托(delegate)从封闭 block 访问局部变量时必须小心。仔细检查代码以确保存储在这些变量中的值在事件处理程序的分配和此处理程序的调用之间不会更改) .

关于c# - 将变量传递给类中的计时器事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16890864/

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