通过反射修改DispatcherObject中的_dispatcher字段以跨线程修改DispatcherObject对象的属性?

时间:2019-03-24 08:36:41

标签: c# wpf

是否可以通过反射来修改DispatcherObject对象中的_dispatcher字段,以跨线程修改DispatcherObject对象的属性?

我是wpf开发的新手。通过观察DispatcherObject的源代码,我了解到DispatcherObject对象只能由其关联的Dispatcher访问。如果是跨线程,是否可以通过修改_dispatcher字段来修改访问权限,以便当前线程可以正常运行? DispatcherObject,这个问题困扰了我很长时间。

public static List<string> GetPrimaryKeyColumns(DbConnection connection, string tableName)
{
        List<string> result = new List<string>();
        DbCommand command = connection.CreateCommand();
        string[] restrictions = new string[] { null, null, tableName };
        DataTable table = connection.GetSchema("IndexColumns", restrictions);

        if (string.IsNullOrEmpty(tableName))
            throw new Exception("Table name must be set.");

        foreach (DataRow row in table.Rows)
        {
            result.Add(row["column_name"].ToString());
        }

        return result;
}

1 个答案:

答案 0 :(得分:1)

在可视树中更改单个UI元素的Dispatcher属性是没有意义的,因为树中的所有元素必须具有相同的线程亲和力。

如果需要从后台线程创建UI元素,则必须在UI线程的Dispatcher中调用创建代码,就像对UI元素的任何其他访问一样:

btn.Dispatcher.Invoke(() =>
{
    btn.Content = new TextBlock { Text = "Click Me!" };
});