Я потратил целый день, пытаясь заставить мое приложение использовать потоки, но не повезло. Я прочитал много документации об этом, и у меня все еще много ошибок, поэтому я надеюсь, что вы можете мне помочь.
У меня есть один большой многопользовательский метод, который вызывает базу данных и обновляет графический интерфейс. Это должно происходить все время (или примерно каждые 30 секунд).
public class UpdateController
{
private UserController _userController;
public UpdateController(LoginController loginController, UserController userController)
{
_userController = userController;
loginController.LoginEvent += Update;
}
public void Update()
{
BackgroundWorker backgroundWorker = new BackgroundWorker();
while(true)
{
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.RunWorkerAsync();
}
}
public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
_userController.UpdateUsersOnMap();
}
}
При таком подходе я получаю исключение, потому что фоновый работник не является и потоком STA (но из того, что я могу понять, это то, что я должен использовать). Я попытался с потоком STA и дал другие ошибки.
Я думаю, проблема в том, что я пытаюсь обновить GUI при выполнении вызова базы данных (в фоновом потоке). Я должен делать только вызов базы данных, а потом каким-то образом он должен вернуться к основному потоку. После выполнения основного потока он должен вернуться к фоновому потоку и так далее. Но я не понимаю, как это сделать.
Приложение должно обновить графический интерфейс сразу после вызова базы данных. Ужины, похоже, не работают. Фоновый поток просто входит в них.
EDIT:
Некоторые действительно отличные ответы:) Это новый код:
public class UpdateController{
private UserController _userController;
private BackgroundWorker _backgroundWorker;
public UpdateController(LoginController loginController, UserController userController)
{
_userController = userController;
loginController.LoginEvent += Update;
_backgroundWorker = new BackgroundWorker();
_backgroundWorker.DoWork += backgroundWorker_DoWork;
_backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;
}
public void _backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
_userController.UpdateUsersOnMap();
}
public void Update()
{
_backgroundWorker.RunWorkerAsync();
}
void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//UI update
System.Threading.Thread.Sleep(10000);
Update();
}
public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// Big database task
}
}
Но как я могу сделать этот запуск каждые 10 секунд? System.Threading.Thread.Sleep(10000) просто заставит мой графический интерфейс заморозить и while (true) loop в Update(), как было предложено, дает исключение (Thread too busy).