Я младший разработчик, использующий .NET Framework.
Я имею дело с проблемой, потому что мой GUI зависает, когда я запускаю свое приложение с большой загрузкой данных.
У меня есть сетка, своего рода выходное текстовое поле для записи строк.В сетке есть строка для каждого ожидаемого сообщения.
Затем приложение получает сообщения, а сетка обновляет ячейку в строке, которая соответствует сообщению.Кроме того, я пишу строку в текстовое поле с информацией о сообщении.
Например, текстовое поле будет содержать сообщения, такие как:
10:23:45 Message 1 arrived and the result is OK
10:23:45 Message 2 arrived and the result is OK
10:23:45 Message 3 arrived and the result is FAIL
10:23:45 Message 4 arrived and the result is OK
10:23:46 Message 5 arrived and the result is OK
....
И сетка будет выглядеть примерно так:
MESSAGE_ID | RESULT <------- HEADER
Message_1 | OK
Message_2 | FAIL
Message_3 | OK
Message_4 | OK
Message_5 | OK
Message_6 | Waiting
Message_7 | Waiting
....
Проблема в том, что когда я получаю несколько сообщений за очень короткий промежуток времени, графический интерфейс пользователя зависает, потому что он постоянно обновляет сетку и текстовое поле.Он останавливается до тех пор, пока не будут получены все сообщения, а сетка и вывод текста не обновятся.
Знаете ли вы, есть ли какой-нибудь способ сделать это так, чтобы графический интерфейс не зависал?использовать более одного потока для обновления графического интерфейса?
Я думаю, что это не BackgroundWorker, потому что именно графический интерфейс должен выполнять эту работу, но, возможно, я ошибаюсь.
EDITED1:
На самом деле у меня естьдве темы:
1) Основная тема.Это GUI, и он имеет BlockingQueue.
private BlockingQueue _guiQueue = new BlockingQueue(1000);
2) Thread1 Он получает сообщения, выполняет некоторую работу после получения сообщения, а затем ставит в очередь результат и отправляет его в GUI:
_guiQueue.Enqueue(new UpdateResult(_message.Name, _message.Result));
Я использую BlockingQueues, вот эти: http://www.codeproject.com/KB/recipes/boundedblockingqueue.aspx
Как только главный поток получает сообщение, он в основном обновляет сетку и текстовое поле вывода, ничего больше.
public MainThread(IMainForm mainView)
{
// presenter
_mainView = mainView;
....
// Blocking queues
_guiQueue = new BlockingQueue(1000);
....
// Timer
logger.Debug("Initializing Timer");
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromMilliseconds(10);
// Call handleMessages method everytime the timer wakes up
_timer.Tick += HandleMessages;
_timer.Start();
...
// Order Passing Thread
logger.Debug("Launching OPThread");
_orderPassingThread = new OPThread(_OPQueue, _commonObjects);
_orderPassingThreadProcess = new Thread(new ThreadStart(_orderPassingThread.OPThreadProcess));
_orderPassingThreadProcess.Start();
...
}
private void HandleMessages(Object sender, EventArgs args)
{
Presenter.Messages.Message message;
while ((message = _guiQueue.Dequeue(10)) != null)
{
switch (message.MessageType)
{
case messageTypes.updateResult:
UpdateResult updateStepMsg = (UpdateResult) message;
_mainView.updateStepResult(updateStepMsg.Name, updateStepMsg.Result); // updates Grid and text box
break;
....
default:
break;
}
}
}
}
Проблема в том, что я получаю более одного сообщения в секунду или около того.
Например, у меня есть кнопка СТОП, чтобы остановить все, но нет никакого способащелкнуть по нему, потому что графический интерфейс остановлен
Спасибо!
PS: я использую DevExpress, сетка - XtraGrid, а текстовое поле вывода - элемент управления memoEdit