1

我想做这样的事情:

private void ttimer_Tick(object sender, EventArgs e, char[,] imatrix)
{
    Awesome code...
}

我有一个用图像填充 DataGridView 的方法,但每次我都需要等待半秒钟。所以,我原来的方法是这样的:

private void myMethod(char[,] imatrix)
{
    Original awesome code...
}

我希望 myMethod 成为每 500 毫秒运行一次的 timerTick 事件。另外,我确实需要发送 char[,] imatrix 参数。我认为有必要在 timerTick 事件中接收对象发送者 EventArgs e 对吗?有什么建议么?谢谢!

4

3 回答 3

2

假设您已经在char[,]本地有可用的,我会使用 lambdas:

char[,] imatrix = GetMyMatrix();
myTimer.Tick += (sender, args) => timer_Tick(sender, args, imatrix);

然后你应该让你的Tick处理程序调用很棒的代码:

private void timer_Tick(object sender, EventArgs e, char[,] imatrix)
{
    myMethod(imatrix);
    //... do something with the timer args
}

如果您实际上并不打算对计时器的事件参数做任何事情(只是想延迟调用myMethod(令人敬畏),只需完全跳过事件处理程序包装方法并直接从 lambda 调用它:

char[,] imatrix = GetMyMatrix();
myTimer.Tick += (sender, args) => myMethod(imatrix);

编辑:关于您的一个问题,是的,签名要求您仅使用object sender, EventArgs e参数。但是,您不需要对它们做任何事情,而 lambda 语法可以帮助您忽略它们。哎呀,如果你想更清楚地说“我不关心事件语法”,你可以这样替换命名参数(尽管这是否是一个好的做法可能值得商榷):

char[,] imatrix = GetMyMatrix();
myTimer.Tick += (_, __) => myMethod(imatrix);
于 2013-05-05T01:50:09.690 回答
0

您不能更改代码的 Tick 方法签名。相反,您可以创建一个全局变量并使用它。

或者

您可以使用代码的 Tag 属性。将您的矩阵存储在那里。无论何时调用 Ticker 的事件,将 sender 转换为 Ticker,然后转换其 Tag 属性以获取您的矩阵。

于 2013-05-05T01:14:38.337 回答
0

也许您在 sender 对象中添加了一个公共属性,然后将 sender 方法参数强制转换为该对象,从而使您可以访问 char[,] 矩阵数据。

于 2013-05-05T01:26:29.453 回答