Написание многопоточного приложения на C # - PullRequest
2 голосов
/ 19 января 2011

Мне нужно написать приложение на c #, которое отслеживает несколько задач, каждая из которых реализуется как экземпляр класса, работающий в своем собственном потоке. Пользовательский интерфейс будет использоваться для отображения состояния каждого экземпляра задачи в зависимости от того, какую задачу я выберу в древовидном представлении, в котором будет отображаться список задач.

Идея, которую я имею, состоит в том, чтобы создать некоторый другой класс, названный PropertyClass, который будет иметь экземпляр TaskClass и некоторые свойства, относящиеся к этому экземпляру TaskClass. Затем, всякий раз, когда экземпляр TaskClass изменяет свое состояние, соответствующее свойство в экземпляре PropertyClass обновляется, а затем пользовательский интерфейс обновляется этими значениями свойства из PropertyClass, когда задача выбирается из списка древовидного списка.

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

Как еще можно эффективно разработать это решение?

Ответы [ 3 ]

4 голосов
/ 19 января 2011

Прочтите этот документ из MSDN на Сначала параллельная библиотека задач .

1 голос
/ 19 января 2011

У меня есть несколько предложений.

Во-первых, вам нужен способ убедиться, что у вас нет потоков, блокирующих закрытие вашего приложения.Один из надежных способов сделать это - убедиться, что все ваши потоки являются фоновыми.Это может быть немного проблематично, если вам нужно убедиться, что работа потока выполнена до того, как он будет присоединен или прерван.

Во-вторых, вы можете посмотреть на использование класса ThreadPool, который должен сделать создание и использование потоков более эффективным.Пул потоков создан для того, чтобы помочь вам управлять вашими потоками.

В-третьих, вам потребуется метод синхронизации доступа к данным из графического интерфейса пользователя с данными в других потоках.В WPF вы используете Dispatcher, а в WinForms вы будете использовать Invoke.

Кроме того, класс BackgroundWorker может помочь со всем этим, если он вписывается в модель вашего приложения.

В-пятых, события и делегаты могут быть BeginInvoked, что по существу помещает их в другой поток.Это своего рода неявное многопоточность и может быть полезным.

Шестое, и у меня еще не было возможности использовать это. .Net 4 имеет библиотеку параллельных задач, которая может быть вам полезна.

В-седьмых, безопасный общий доступ к данным и синхронизация могут быть выполнены с помощью блокировки и / или монитора.

Надеюсь, это поможет.

-Nate

0 голосов
/ 19 января 2011

Если каждый экземпляр TaskClass соответствует узлу в древовидном представлении, вы можете сохранить экземпляр TaskClass в свойстве Tag элемента древовидного представления. Или вы можете создать словарь TaskClasses, снабженный уникальным идентификатором, таким как GUID, и сохранить этот идентификатор в свойстве Tag.

В любом случае используйте метод обратного вызова, чтобы указать, что экземпляр TaskClass имеет обновление.

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