奇怪的线程行为

时间:2013-11-28 22:02:29

标签: c# wpf multithreading datagrid

.Hi,我在使用wpf和线程方面遇到了一些问题,我只是不能在这里讨论什么是幸福的。

我有这个事件func

private void TaskActiveChangeClicked(object sender, RoutedEventArgs e)
{
   //Do things...
   this.ChangeTask((sqTask)this.SelectionObject, (sqTask)this.SelectionObject);
   this.FindSelectionObject();
}

ChangeTask

private void ChangeTask(sqTask Old, sqTask New)
{            
    //Do things (update in mongoDB)...
    this.LoadTaskList();
}

LoadTaskList [TaskListTable是一个DataGrid]

private void LoadTaskList()
{
    //Do things (query mongoDB and get List<sqTask>)...
    this.Dispatcher.Invoke((Action)(() =>
    {
        TaskListTable.Items.Clear();
        foreach (sqTask task in TaskList)
        {
            TaskListTable.Items.Add(db);
        }
    }                
    ));
}

现在奇怪的部分......

SelectedIndex绑定到TaskListTable DataGrid(SelectedIndex="{Binding SelectedIndex}"

当我像这样运行FindSelectionObject()时:

private void FindSelectionObject()
{
    this.SelectedIndex = TaskListTable.Items.IndexOf(((sqTask)SelectionObject));
    MessageBox.Show("");
    DataGridRow row = TaskListTable.ItemContainerGenerator.ContainerFromItem(TaskListTable.Items[SelectedIndex]) as DataGridRow;                        
    row.Background = Brushes.LightGoldenrodYellow
}

它完美无缺,但如果我删除MessageBox崩溃,那么row不包含实例

我猜LoadTaskList将项目添加到DataGrid,但是在调用结束之前它不会更新。 因此,...ContainerFromItem(TaskListTable.Items[SelectedIndex]) as DataGridRow;是空的。

但是当我使用messageBox时,它会在搜索表格中的行之前做一些“Tick”。

问题: 我对吗?我该如何解决? (顺便说一句,如果你可以添加到theads的答案推荐指南使用我会很高兴)

谢谢!

1 个答案:

答案 0 :(得分:1)

这是因为当您显示该框时,TaskListTable会添加所有项目。如果你把一个假的Thread.Sleep放在那里,那就行了。