Вопросы синхронизации в .NET - PullRequest
0 голосов
/ 30 июля 2011

У меня есть несколько вопросов по синхронизации потоков, связанных с простым дизайном .NET C #.У меня есть идеи о том, как сделать синхронизацию, но я хотел бы передать идеи другим программистам, которые имеют больше опыта .Net, чем я (почти кто-либо).

Дизайн:

Этотестовое программное обеспечение

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

Затем существует поток, который выполняет тест.Он хранится отдельно от GUI, поэтому GUI останется отзывчивым.Тест прост, без учета реального времени, взрывающихся вещей и т. Д.

Затем существует класс данных с результатами тестов.

Я думал о создании класса данныхглобальная статическая (так что будет только одна) и совместно используемая двумя потоками, защищенными с помощью Mutex.Класс run получит Mutex, затем обновит данные, выпустит Mutex и затем вызовет метод делегата, который обновит GUI.Есть ли лучший способ сделать это?

Прервать, остановить грациозно, сделать паузу и возобновить труднее.Метод run test перемещается в своем собственном потоке, когда вдруг пользователь хочет что-то изменить.Изящная остановка, пауза и возобновление могут быть обработаны с помощью флагов в классе данных, которые периодически проверяются потоком выполнения.Эти флаги могут быть установлены потоком GUI (конечно, снова используя Mutex).И прервать ... Как насчет уничтожения потока выполнения и последующего вызова метода, который переводит все тестовое оборудование в известное состояние?Есть ли лучший способ сделать это?

1 Ответ

2 голосов
/ 30 июля 2011

Я согласен, что ваш вопрос может быть более конкретным, но я сделаю снимок.

Как правило, вы правильно используете Flags, чтобы сигнализировать рабочему потоку, когда он должен изящно приостановить / возобновить / остановить (Auto и ManualResetEvent также могут пригодиться). Вы также правы, что Abort станет вашей самой большой проблемой. Поскольку вы, вероятно, вызываете код, который не принадлежит вам (или, по крайней мере, код, который не знает, что он вызывается в рабочем потоке), у вас нет способа сообщить рабочему потоку, что он должен прерваться, когда он находится в середине тестовое задание. Использование Thread.Abort считается «вредным» и может привести процесс в странное состояние. Вы можете попробовать использовать AppDomain для песочницы выполнения тестового кода, что позволит вам просто завершить работу всего AppDomain в случае прерывания. В любом случае, это был бы хороший подход, так как тестируемый код мог изменять глобальное состояние, тем самым влияя на будущие тестовые прогоны в том же процессе.

Кроме того, поскольку звучит так, будто вы пишете какой-то тестовый интерфейс / фреймворк, рассматривали ли вы возможность использования существующего пакета, такого как NUnit, или возможностей тестирования, встроенных в Visual Studio?

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