好的,我在.Net 4和C#中使用了System.Timers.Timer
。
我的timer对象如下所示:
var timer = new Timer {Interval = 123};
我让我的计时器流逝事件处理程序指向如下方法:
timer.Elapsed += MyElapsedMethod;
我的方法看起来像这样:
static void MyElapsedMethod(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Foo Bar");
}
我想把一个字符串传递给这个方法,我该怎么做呢?
谢谢
发布于 2012-04-02 21:36:19
最简单的方法是将事件处理程序更改为匿名函数。它允许您在声明点传递字符串。
string theString = ...;
timer.Elapsed += (sender, e) => MyElapsedMethod(sender, e, theString);
static void MyElapsedMethod(object sender, ElapsedEventArgs e, string theString) {
...
}
发布于 2015-02-21 18:43:55
如果你想再次注销你的"Elapsed“事件处理程序,你不应该在没有记住变量的情况下使用委托。
因此,另一种解决方案可以是基于Timer创建自定义类。只需添加您喜欢的任何成员,并从"Elapsed“事件处理程序的"sender”参数中获取您的自定义计时器对象:
class CustomTimer : System.Timers.Timer
{
public string Data;
}
private void StartTimer()
{
var timer = new CustomTimer
{
Interval = 3000,
Data = "Foo Bar"
};
timer.Elapsed += timer_Elapsed;
timer.Start();
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
string data = ((CustomTimer)sender).Data;
}
当然,只要基类不是密封的,这种策略也适用于其他事件和类。
发布于 2012-04-02 21:35:31
您可以将字符串保存在某个对象中,然后在事件处理程序中读取它:
static string _value;
static void MyElapsedMethod(object sender, ElapsedEventArgs e)
{
Console.WriteLine(_value);
}
更新:相同的代码通过不同的语法:timer.Elapsed += (s,e) => Console.WriteLine(_value);
更新:也可以考虑使用System.Threading.Timer
State state = new State();
Timer timer = new Timer(OnTimer, state, 0, 123);
state.Value = "FooBar"; // change state object
您可以在定时器回调中检索状态:
static void OnTimer(object obj)
{
State state = obj as State;
if (state == null)
return;
Console.WriteLine(state.Value);
}
https://stackoverflow.com/questions/9977393
复制相似问题