我有一些奇怪的事情发生在这里。
我有这样的空白
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'类型的第一次机会异常
附加信息:调用线程无法访问此对象,因为另一个>线程拥有它。
答案 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); }));