Проблема с несколькими потоками

#.net #multithreading

#.net #многопоточность

Вопрос:

Сценарий : —

У вас есть приложение, которое получает каналы (данные) с разных серверов. Ваше приложение поддерживает несколько потоков для каждого сервера (для получения каналов) плюс один поток для GUI. В вашем графическом интерфейсе отображаются три индикатора выполнения (по одному для каждого сервера), запущенных в разных потоках.

Вопрос: —

Если процессор достаточно занят для получения канала, как бы вы сделали так, чтобы индикатор выполнения обновлялся каждый раз, когда вы получаете канал с любого сервера.

Ограничение: —

Вам не разрешается изменять архитектуру или интерфейсы. Поток GUI недоступен для потоков сервера.

Комментарии:

1. Используете ли вы BackgroundWorkers? Используете ли вы класс Thread напрямую? Если мы не можем изменить архитектуру или интерфейсы, нам, по крайней мере, нужно посмотреть, как на самом деле выглядит текущая.

Ответ №1:

Строго в соответствии с этими ограничениями вы можете использовать DataBinder в ProgressBar.BindingContext и привязать его к пользовательскому классу, который имеет значение для progress, этот пользовательский класс реализует интерфейс INotifyPropertyChanging . Затем вы настраиваете три статические переменные, по одной для каждой устанавливаемой вами привязки данных (по одной для каждого индикатора выполнения). затем просто добавьте значение статической переменной.

Смотрите: http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanging.aspx

Другим вариантом является использование делегатов, которые не требуют ссылки на поток, породивший элемент управления, в целом они кажутся предпочтительным способом обработки многопоточности и обновлений пользовательского интерфейса (пример в vb.net просто потому, что):

 protected delegate sub updateProgressdelegate(ByVal control As ProgressBar, byVal value as integer)

protected shared sub updateProgress(ByVal control As ProgressBar, byVal value as integer)
    if(control.invokeRequired) then
        control.invoke(new updateProgressDelegate(addressof updateprogress), control, value)
        exit sub
    end if
    control.value = value

    'these aren't really needed but some people like to do them...
    control.invalidate()
    control.refresh()
end sub
  

смотрите это для получения информации о делегате:
http://msdn.microsoft.com/en-us/magazine/cc301810.aspx

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