Timer Elapsed事件处理程序,无法在其中运行特定代码

时间:2011-03-09 22:24:25

标签: c# event-handling timer nullreferenceexception

我有一些奇怪的事情发生在这里。

我有这样的空白

private void Filter()
{
    MyDataView.RowFilter = string.Format("Name LIKE '%{0}%'", tb_Filter.Text);
}

然后我有一个计时器经过的事件处理程序,它的方法就像这样

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    Filter();
}

我将 timer.AutoReset 设置为false,并将 timer.Start()放入事件处理程序中以获取按钮。 我点击按钮,没有任何反应。它只是暂停一段时间,然后把它吐出来:

An unhandled exception of type 'System.NullReferenceException' occurred in PresentationFramework.dll

Additional information: Object reference not set to an instance of an object.

如果我从任何其他事件处理程序(button_click,textchanged,无论如何)中运行 Filter()方法,它运行正常。 如果我在timer_Elapsed事件处理程序中放入任何其他代码,则在调用Filter()之前,它将运行。例如:

    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("this works");
    }
当计时器过去时,

会将“this works”打印到控制台。

我很困惑。我在这做错了什么?
为什么我的Filter()方法可以在除timer_elapsed之外的任何事件上运行?

编辑:有更详细的例外:

  

WindowsBase.dll中出现'System.InvalidOperationException'类型的第一次机会异常

     

附加信息:调用线程无法访问此对象,因为另一个>线程拥有它。

3 个答案:

答案 0 :(得分:2)

Elapsed事件处理程序在线程池线程上运行。这对RowFilter属性是有害的,分配它将导致控件更新。这只能在UI线程上完成,用户界面组件永远不会是线程安全的。

改为使用常规的Winforms Timer。

答案 1 :(得分:0)

是否可能抛出异常?我通常会启用Debug - >例外 - > Common Language Runtime Exceptions选项,然后重试。

答案 2 :(得分:0)

似乎你的timer_Elapsed处理程序在一个线程中启动,与UI不同。这意味着您可以从那里执行与线程无关的操作(如打印到控制台),但如果您尝试访问UI对象,则会失败。

您可以在此处阅读这些问题:http://msdn.microsoft.com/en-us/magazine/cc163328.aspx 作为一种快速解决方案,您可以替换

MyDataView.RowFilter = string.Format("Name LIKE '%{0}%'", tb_Filter.Text);

类似

Dispatcher.Invoke(new Action(() => { MyDataView.RowFilter = string.Format("Name LIKE '%{0}%'", tb_Filter.Text); }));