首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将对象传递给计时器事件?

如何将对象传递给计时器事件?
EN

Stack Overflow用户
提问于 2012-04-02 21:29:07
回答 7查看 60.6K关注 0票数 52

好的,我在.Net 4和C#中使用了System.Timers.Timer

我的timer对象如下所示:

代码语言:javascript
复制
var timer = new Timer {Interval = 123};

我让我的计时器流逝事件处理程序指向如下方法:

代码语言:javascript
复制
timer.Elapsed += MyElapsedMethod;

我的方法看起来像这样:

代码语言:javascript
复制
static void MyElapsedMethod(object sender, ElapsedEventArgs e)
{
    Console.WriteLine("Foo Bar");
}

我想把一个字符串传递给这个方法,我该怎么做呢?

谢谢

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-04-02 21:36:19

最简单的方法是将事件处理程序更改为匿名函数。它允许您在声明点传递字符串。

代码语言:javascript
复制
string theString = ...;
timer.Elapsed += (sender, e) => MyElapsedMethod(sender, e, theString);

static void MyElapsedMethod(object sender, ElapsedEventArgs e, string theString) {
  ...
}
票数 115
EN

Stack Overflow用户

发布于 2015-02-21 18:43:55

如果你想再次注销你的"Elapsed“事件处理程序,你不应该在没有记住变量的情况下使用委托。

因此,另一种解决方案可以是基于Timer创建自定义类。只需添加您喜欢的任何成员,并从"Elapsed“事件处理程序的"sender”参数中获取您的自定义计时器对象:

代码语言:javascript
复制
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;
}

当然,只要基类不是密封的,这种策略也适用于其他事件和类。

票数 26
EN

Stack Overflow用户

发布于 2012-04-02 21:35:31

您可以将字符串保存在某个对象中,然后在事件处理程序中读取它:

代码语言:javascript
复制
static string _value;

static void MyElapsedMethod(object sender, ElapsedEventArgs e)
{
    Console.WriteLine(_value);
}

更新:相同的代码通过不同的语法:timer.Elapsed += (s,e) => Console.WriteLine(_value);

更新:也可以考虑使用System.Threading.Timer

代码语言:javascript
复制
State state = new State();
Timer timer = new Timer(OnTimer, state, 0, 123);
state.Value = "FooBar"; // change state object

您可以在定时器回调中检索状态:

代码语言:javascript
复制
static void OnTimer(object obj)
{
    State state = obj as State;
    if (state == null)
        return;        

    Console.WriteLine(state.Value);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9977393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档