2015-09-15 15 views
-1

Предположим, что у меня есть код, где программа должна показывать пользователю какой-то диалог пользовательского интерфейса и в зависимости от результата диалога выполнять два действия. Если у меня есть несколько потоков, каждый из которых запускает этот код, я получу несколько диалогов, по одному для каждого потока. Вопрос: что, если я хочу один диалог вместо нескольких (например, вызванный первым потоком, выполняющий этот код)? И результат этого диалога должен влиять на все последующие потоки, а не показывать диалог для каждого из них. Как я могу это сделать?Выполнить код один раз в несколько потоков

Как раз упомянуть, я могу изменить только упомянутую часть кода, поэтому изменение источника потоков запрещено.

+1

Сделайте статический экземпляр. – kevintjuh93

+0

@Kevin Kal, это, конечно, возможно, но как я могу заставить все потоки использовать результат одного и того же диалога? – lentinant

+0

О, это может быть не проблема, у меня это есть. – lentinant

ответ

0

Вы можете создать экземпляр диалогового окна. Добавьте к нему некоторые функции, которые обрабатывают все.

Чтобы использовать результат во всех потоках, просто сохраните результат где-то в экземпляре, чтобы его можно было получить везде. Существует несколько способов сделать такие вещи. Вы можете добавить EventHandler в singleton, и каждый созданный поток создает ссылку на это событие. Выполняйте его каждый раз, когда вы получаете результат. Или сделайте другую статическую переменную, такую ​​как Singleton.LastResult

Здесь вы найдете link о Singleton's in C#. Убедитесь, что вы все правильно справляетесь. Когда он закрывается, уничтожьте экземпляр.

+0

Может потребоваться инструкция 'lock', так как даже если я использую что-то вроде' if (dialog == null) ', несколько потоков могут преуспеть до того, как будет создан экземпляр реального диалога. И снова один поток может уничтожить экземпляр, даже если он еще не использовался другими потоками. – lentinant

+0

Конечно, вам нужно сделать замок. И для второй проблемы, поэтому вы должны сделать что-то вроде: 'public static int DialogResult {get; частный набор; } ' – kevintjuh93

Смежные вопросы