Я не могу понять это ... Я следил за несколькими различными инструкциями, которые я нашел повсюду, но я не могу понять, как не заморозить поток пользовательского интерфейса при выполнении нескольких задач.Как не замораживать поток пользовательского интерфейса?
Я запускаю это, когда окно загружается. В корне окна в 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() является negligable, проблема не здесь - это в 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;
}
(Как вы можете видеть, ive попытался изменить разные вещи и не мог заставить что-либо работать).
В общем, и HeroesDBAddHeroes(), и HeroesDBAddComments() необходимо запускать вместе, у них нет конфликтов друг с другом и т. Д. В будущем у меня будут другие методы для запуска, в то же время в отдельных потоках.
Однако, я должен дождаться, когда все это будет завершено, прежде чем продолжить и разрешить запуск HeroesDBAssignComments(). Если все выше уже не будет полным, оно не будет работать. Затем мне нужно изменить логические значения Boot и MainMenuVisibility после завершения работы с HeroesDBAssignComments.
Вы пытались вызвать метод 'Dispatcher.Invoke (...)'? –
Нельзя использовать Thread.Sleep() для ожидания. Вместо этого используйте [WaitHandle] [1]. [1]: http://stackoverflow.com/questions/2538065/what-is-the-basic-concept-behind-waithandle – Hristo
Где я могу это сделать? – pingu2k4