使用BackgroundWorker创建新的usercontrol失败

时间:2012-07-31 06:29:08

标签: wpf multithreading backgroundworker sta

我环顾谷歌导致我需要进行mutithread,因为我的程序在尝试加载gif并同时加载用户控件时会滞后。相反,gif挂起,页面突然显示我的usercontrol没有任何转换。好的程序应该如何表现,

显示gif - >加载用户控件 - >隐藏Gif - >运行动画(有效的简单幻灯片)

但由于渲染usercontrol的ui元素时出现滞后,程序的行为如下

显示Gif - > Gif挂起(或冻结) - >立即显示Usercontrol

所以我发现这个东西叫做BackgroundWorker。听起来不错。嗯......不完全。我尝试了它并将其应用于我的代码,如此

        BackgroundWorker worker = new BackgroundWorker();
        CrowdWatch_Portrait.CrowdWatch crowder;
        //The page is a frame fyi
        thePage.LoadCompleted += new LoadCompletedEventHandler(thePage_LoadCompleted);

        worker.DoWork += delegate(object s, DoWorkEventArgs args)
        {

                crowder = new CrowdWatch_Portrait.CrowdWatch();
                thePage.Content = crowder;

        };


        worker.RunWorkerAsync();

听起来不错。跑吧。失败。它给了我这个错误

调用线程必须是STA,因为许多UI组件都需要这个。

因此,在再次在线研究之后,我找不到任何使用此类加载用户控件的场景。所以我转向社区寻求帮助....帮忙?

2 个答案:

答案 0 :(得分:0)

我不记得原因,但在我的一个程序中,我遇到了同样的错误。 我解决了这段代码:

_wakeupthread.SetApartmentState(System.Threading.ApartmentState.STA);

希望它有所帮助:-)

答案 1 :(得分:0)

尝试在UI调度程序上设置页面内容,如下所示 -

App.Current.Dispatcher.BeginInvoke((Action)delegate{ thePage.Content = crowder; });