Как проверить, занят ли поток в C #? - PullRequest
5 голосов
/ 28 января 2012

У меня в потоке работает пользовательский интерфейс Windows Forms, Thread1. У меня есть другой поток, Thread2, который получает тонны данных через внешние события, которые необходимо обновить пользовательский интерфейс Windows. (Это фактически обновляет несколько потоков пользовательского интерфейса.)

У меня есть третий поток, Thread3, который я использую в качестве потока буфера между Thread1 и Thread2, чтобы Thread2 мог продолжать обновлять другие потоки (тем же методом).

Мой буферный поток, Thread3, выглядит так:

public class ThreadBuffer
{
    public ThreadBuffer(frmUI form, CustomArgs e)
    {
        form.Invoke((MethodInvoker)delegate { form.UpdateUI(e); });
    }
}

Я бы хотел, чтобы мой ThreadBuffer проверил, занята ли моя форма предыдущими обновлениями. Если это так, я бы хотел, чтобы он дождался освобождения и затем вызвал UpdateUI(e).

Я думал о любом из них:

а) * * тысяча двадцать-одна

//PseudoCode

while(form==busy)
{
    // Do nothing;
}
form.Invoke((MethodInvoker)delegate { form.UpdateUI(e); });

Как мне проверить form==busy? Кроме того, я не уверен, что это хороший подход.

b) Создайте событие в форме 1, которое уведомит ThreadBuffer, что оно готово к обработке.

// psuedocode

List<CustomArgs> elist = new List<CustomArgs>();

public ThreadBuffer(frmUI form, CustomArgs e)
{
    from.OnFreedUp += from_OnFreedUp();
    elist.Add(e);
}

private form_OnFreedUp()
{
    if (elist.count == 0)
        return;
    form.Invoke((MethodInvoker)delegate { form.UpdateUI(elist[0]); });
    elist.Remove(elist[0]);
}

В таком случае, как мне написать событие, которое сообщит, что форма свободна?

и

в) другие идеи?

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Есть событие, которое вы можете посмотреть на

System.Windows.Forms.Application.Idle 
2 голосов
/ 28 января 2012

Как мне проверить форму == занято? Кроме того, я не уверен, что это хороший подход

Control.Invoke эффективно делает это уже. Нет причины «ждать, пока поток не будет занят», поскольку вызов Invoke не вернется, пока не будет обработан метод, что не произойдет, пока поток не будет занят.

Вы можете просто позвонить Invoke и не беспокоиться о том, занят ли поток пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...