UWP C#将UI对象返回到主线程上的同步扩展方法

UWP C#将UI对象返回到主线程上的同步扩展方法,c#,multithreading,uwp,windows-10-universal,C#,Multithreading,Uwp,Windows 10 Universal,我正在尝试为页面类编写一个扩展方法,该类将返回一个用户控件,该控件是根网格动态创建的子控件。我遇到的问题是如何处理页面类的内容属性 其目的是返回控件以检查控件的属性,并且主要从主线程调用 以下是我想做的: public static MyUserControl GetControlByTag(this Page page, int tag) { //throws "marshalled from a different thread" exception Grid rootGri

我正在尝试为
页面
类编写一个扩展方法,该类将返回一个用户控件,该控件是根
网格
动态创建的子控件。我遇到的问题是如何处理
页面
类的
内容
属性

其目的是返回控件以检查控件的属性,并且主要从主线程调用

以下是我想做的:

public static MyUserControl GetControlByTag(this Page page, int tag) {
    //throws "marshalled from a different thread" exception
    Grid rootGrid = page.Content as Grid;  

    if(rootGrid != null) {
        var controls = rootGrid.Children.OfType<MyUserControl>();

        foreach(MyUserControl control in controls)
        {
            if(control.Tag == tag) return control;
        }

    return null;
}

我通过MSDN找到了解决方案:

public static MyUserControl GetControlByTag(this Page page, int tag) {
    MyUserControl rtn = null; 

    page.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
        Grid rootGrid = page.Content as Grid;

        if(rootGrid != null) {
            var controls = rootGrid.Children.OfType<MyUserControl>();

            foreach(MyUserControl control in controls)
            {
                if(control.Tag == tag) rtn = control;
            }
        }
    }).AsTask().Wait(); //Runs the dispatcher synchronously

    return rtn;
}
public static MyUserControl GetControlByTag(this Page page, int tag) {
    MyUserControl rtn = null; 

    page.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
        Grid rootGrid = page.Content as Grid;

        if(rootGrid != null) {
            var controls = rootGrid.Children.OfType<MyUserControl>();

            foreach(MyUserControl control in controls)
            {
                if(control.Tag == tag) rtn = control;
            }
        }
    }).AsTask().Wait(); //Runs the dispatcher synchronously

    return rtn;
}
public static MyUserControl GetControlByTag(this Page page, int tag) {
    Grid rootGrid = page.Content as Grid;

    if(page.Dispatcher.HasThreadAccess) {
        //Code to run
    }
    else {
        page.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
            //Code to run
        }).AsTask().Wait();
    }
}