Я потратил целый день, пытаясь заставить мое приложение использовать потоки, но безуспешно. Я прочитал много документации об этом, и все еще получаю много ошибок, поэтому я надеюсь, что вы мне поможете.
У меня есть один большой трудоемкий метод, который вызывает базу данных и обновляет графический интерфейс. Это должно происходить постоянно (или примерно каждые 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, и это дало другие ошибки.
Я думаю, что проблема в том, что я пытаюсь обновить графический интерфейс при выполнении вызова базы данных (в фоновом потоке). Я должен только делать вызов базы данных, а затем каким-то образом он должен переключиться обратно в основной поток. После выполнения основного потока он должен вернуться к фоновому потоку и так далее. Но я не вижу, как это сделать.
Приложение должно обновить графический интерфейс сразу после вызова базы данных. События огня, кажется, не работают. Фоновая нить просто входит в них.
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) просто заставит мой GUI зависать, и цикл while (true) в Update (), как предлагается, дает исключение (поток слишком занят).