我無法弄清楚這一點......我遵循了我在各處找到的幾種不同的說明,但我無法找到如何在執行幾項任務時不凍結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