我无法弄清楚这一点......我遵循了我在各处找到的几种不同的说明,但我无法找到如何在执行几项任务时不冻结UI线程。如何不冻结UI线程?
我在窗口加载时运行它。 在MainWindow.xaml窗口的根,我有:
<i:Interaction.Triggers>
<i:EventTrigger EventName="ContentRendered">
<i:InvokeCommandAction Command="{Binding WindowLoaded}" />
</i:EventTrigger>
</i:Interaction.Triggers>
触发如下:
private void WindowLoadedEx(object p)
{
DBMan();
LoadValues();
//Boot = false;
//MainMenuVisibility = true;
}
DBMAN()是微不足道的,问题不在这里 - 这是在LoadValues() 。我砍了很多,尝试了各种不同的东西,没有任何工作。
private void LoadValues()
{
//ThreadStart AddHeroesRef = new ThreadStart(HeroesDBAddHeroes);
//Thread AddHeroesThread = new Thread(AddHeroesRef);
//AddHeroesThread.Start();
////HeroesDBAddHeroes();
//ThreadStart AddCommentsRef = new ThreadStart(HeroesDBAddComments);
//Thread AddCommentsThread = new Thread(AddCommentsRef);
//AddCommentsThread.Start();
////HeroesDBAddComments();
ThreadStart LoadValuesRef = new ThreadStart(LoadValuesThreaded);
Thread LoadValuesThread = new Thread(LoadValuesRef);
LoadValuesThread.Start();
//HeroesDBAssignComments();
//SetDBIDs();
}
private async void LoadValuesThreaded()
{
ThreadStart AddHeroesRef = new ThreadStart(HeroesDBAddHeroes);
Thread AddHeroesThread = new Thread(AddHeroesRef);
AddHeroesThread.Start();
//HeroesDBAddHeroes();
ThreadStart AddCommentsRef = new ThreadStart(HeroesDBAddComments);
Thread AddCommentsThread = new Thread(AddCommentsRef);
AddCommentsThread.Start();
//HeroesDBAddComments();
while (AddHeroesThread.IsAlive || AddCommentsThread.IsAlive)
{
Thread.Sleep(1);
}
HeroesDBAssignComments();
SetDBIDs();
Boot = false;
MainMenuVisibility = true;
}
(正如你所看到的,我试图改变不同的东西,并且不能得到任何工作)。基本上,HeroesDBAddHeroes()和HeroesDBAddComments()都需要一起运行,它们之间没有任何冲突。我将来还会有其他方法在这里运行,同时也在单独的线程中运行。
但是,在继续并允许HeroesDBAssignComments()运行之前,我需要等待这些完成。如果上面的所有内容都不完整,它不会工作。然后,一旦HeroesDBAssignComments完成,我需要更改布尔值Boot和MainMenuVisibility。
你有没有试过调用'Dispatcher.Invoke(...)'方法? –
你不应该使用Thread.Sleep()来等待。改用[WaitHandle] [1]。 [1]:http://stackoverflow.com/questions/2538065/what-is-the-basic-concept-behind-waithandle – Hristo
哪里做呢? – pingu2k4