silverlight中有时候的数据都是通过异步得到的,当得到需要的数据我们之间操作界面的控件,控件的值时候都会出现”跨线程访问无效。”
自定义线程来获取数据,或者对界面操作时候。这时候 UI 线程和自定义线程不是同一个线程 这样都会报错
解决方法如下
public partial class ChildWindow1 : ChildWindow
{
System.Threading.Thread t;
public ChildWindow1()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(ChildWindow1_Loaded);
}
void ChildWindow1_Loaded(object sender, RoutedEventArgs e)
{
t = new System.Threading.Thread(WriteY);
t.Start();
}
private void WriteY()
{
test((o) =>
{
Dispatcher.BeginInvoke(() =>
{
t = null;
CancelButton_Click(null, null);
});
});
}
private void test(Action<bool> result)
{
if (true)
{
result(true);
}
}
private void OKButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
}
}
Dispatcher 维护按优先顺序排列的特定线程的工作项队列。
当 Dispatcher 创建在一个线程,它就会成为唯一 Dispatcher 可与该线程关联即使 Dispatcher 关闭的情况下。
在 WPF, 、 DispatcherObject 只能由访问 Dispatcher 与之关联。 例如,后台线程不能更新的内容 Button 关联 Dispatcher 上 UI 线程。 为了使后台线程访问 Content 属性 Button, ,后台线程必须将工作委托给 Dispatcher 与关联 UI 线程。 这通过使用实现 Invoke 或 BeginInvoke。 Invoke 是同步和 BeginInvoke 是异步的。 该操作将添加到的队列 Dispatcher 指定 DispatcherPriority。