Как сделать 2 формы на 2 отдельных потоках в приложении winform C #

Я разрабатываю интерфейс в своем приложении winform для C# 4.0, чтобы убрать некоторые sms навалом. Каждое содержимое сообщения отличается от другого, так что я должен отправлять сообщения один за другим. У меня есть форма, откуда конечный пользователь может снимать smss, может быть более тысячи.

Я хочу управлять очередью. Если пользователь снимает смс, он будет отправлен в очередь, и очередь отправит sms один за другим.

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

Итак, как я могу достичь этой задачи? Я пробовал BackGroundWorker , но я не знаю, как поддерживать отдельный поток с формой.

0
nl ja de

4 ответы

Все формы должны быть в потоке пользовательского интерфейса. Отправка SMS должна выполняться с помощью события BackgroundWorker.DoWork . Обновление формы затем выполняется с помощью события BackgroundWorker.RunWorkerCompleted .

Потоком пользовательского интерфейса является основной поток приложения для SWF (winforms)

Если вы используете C# 4.0 или выше, вам также может понадобиться инвестировать в Parallel Library ( http://msdn.microsoft.com/en-us/library/dd460717.aspx ). Но я бы сначала использовал BackgroundWorker для работы. Затем используйте TPL для отправки синхронных SMS. Мог действительно ускорить ситуацию.

2
добавлено
В принципе да.
добавлено автор Richard Schneider, источник
@ FredrikMörk, я считаю, что насос сообщений Windows не будет доставляться в формы на потоке, отличном от UI. Я тоже его не изучил.
добавлено автор Richard Schneider, источник
@HaiderAliWajihi Вы не можете получить доступ к элементу управления из потока, отличного от UI. Вам необходимо собрать информацию из datagrid и передать ее фоновому работнику.
добавлено автор Richard Schneider, источник
@RichardSchneider: Несколько лет назад я провела небольшое исследование, в результате чего появилась запись в блоге ( Общий подход к потокобезопасной форме всплеска ), и, похоже, он работает нормально. Тем не менее, кажется очень необычным случаем, что создание формы в отдельном потоке было бы решением реальной проблемы. Ваше решение здесь лучше; он также направлен на отделение работы от презентации.
добавлено автор Fredrik Mörk, источник
Насколько я знаю, нет никаких ограничений в том, что все формы должны быть созданы в одном потоке. Однако любое взаимодействие с формой должно выполняться в том же потоке, на котором он был создан. Я не сделал этого широко, хотя, возможно, может быть какая-то ошибка, о которой я не знаю.
добавлено автор Fredrik Mörk, источник
это UI Thread - главная тема? пожалуйста, кратко опишите свой ответ
добавлено автор Haider Ali Wajihi, источник
@ Рихард Шнайдер, Хорошо, я получил формулу, как добиться, пожалуйста, подтвердите мою идею. в фоновом рабочем режиме - метод runWorkerAsynch отправляет смс, в рабочем заполненном обновлении формы и снова запустите рабочего, если sms ожидает.
добавлено автор Haider Ali Wajihi, источник
У меня есть DataGridView во второй форме/форме очереди, когда я использую этот datagridview в фоновом работнике, тогда я получил сообщение об ошибке для ссылки на перекрестные ссылки. как закончить это.
добавлено автор Haider Ali Wajihi, источник
@Richard Schneider, Спасибо, я собираюсь попробовать это решение.
добавлено автор Haider Ali Wajihi, источник
@Richard Schneider, снова спасибо за ваше предложение о TPL.
добавлено автор Haider Ali Wajihi, источник

Все формы должны быть в потоке пользовательского интерфейса. Отправка SMS должна выполняться с помощью события BackgroundWorker.DoWork . Обновление формы затем выполняется с помощью события BackgroundWorker.RunWorkerCompleted .

Потоком пользовательского интерфейса является основной поток приложения для SWF (winforms)

Если вы используете C# 4.0 или выше, вам также может понадобиться инвестировать в Parallel Library ( http://msdn.microsoft.com/en-us/library/dd460717.aspx ). Но я бы сначала использовал BackgroundWorker для работы. Затем используйте TPL для отправки синхронных SMS. Мог действительно ускорить ситуацию.

2
добавлено
В принципе да.
добавлено автор Richard Schneider, источник
@ FredrikMörk, я считаю, что насос сообщений Windows не будет доставляться в формы на потоке, отличном от UI. Я тоже его не изучил.
добавлено автор Richard Schneider, источник
@HaiderAliWajihi Вы не можете получить доступ к элементу управления из потока, отличного от UI. Вам необходимо собрать информацию из datagrid и передать ее фоновому работнику.
добавлено автор Richard Schneider, источник
@RichardSchneider: Несколько лет назад я провела небольшое исследование, в результате чего появилась запись в блоге ( Общий подход к потокобезопасной форме всплеска ), и, похоже, он работает нормально. Тем не менее, кажется очень необычным случаем, что создание формы в отдельном потоке было бы решением реальной проблемы. Ваше решение здесь лучше; он также направлен на отделение работы от презентации.
добавлено автор Fredrik Mörk, источник
Насколько я знаю, нет никаких ограничений в том, что все формы должны быть созданы в одном потоке. Однако любое взаимодействие с формой должно выполняться в том же потоке, на котором он был создан. Я не сделал этого широко, хотя, возможно, может быть какая-то ошибка, о которой я не знаю.
добавлено автор Fredrik Mörk, источник
@ Рихард Шнайдер, Хорошо, я получил формулу, как добиться, пожалуйста, подтвердите мою идею. в фоновом рабочем режиме - метод runWorkerAsynch отправляет смс, в рабочем заполненном обновлении формы и снова запустите рабочего, если sms ожидает.
добавлено автор Haider Ali Wajihi, источник
У меня есть DataGridView во второй форме/форме очереди, когда я использую этот datagridview в фоновом работнике, тогда я получил сообщение об ошибке для ссылки на перекрестные ссылки. как закончить это.
добавлено автор Haider Ali Wajihi, источник
@Richard Schneider, Спасибо, я собираюсь попробовать это решение.
добавлено автор Haider Ali Wajihi, источник
@Richard Schneider, снова спасибо за ваше предложение о TPL.
добавлено автор Haider Ali Wajihi, источник
это UI Thread - главная тема? пожалуйста, кратко опишите свой ответ
добавлено автор Haider Ali Wajihi, источник

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

you have to have a queue or even better a concurrent queue http://msdn.microsoft.com/en-us/library/dd267265.aspx

рабочий поток ждет, когда в очереди появляется элемент (смс), принимает этот элемент и выполняет свою работу.

пользовательский интерфейс полностью отделен от этой работы.

это самое основное использование класса Thread.

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

1
добавлено
Я прошу прощения. это многопоточные мелочи. Я не знаю. прочитайте Рихтера или еще что-нибудь. thread vs threadpool .. или попросить Фредерика и Ричарда - им нравится обсуждать вещи.
добавлено автор Boppity Bop, источник
В большинстве случаев BlockingCollection предпочтительнее ConcurrentQueue (он будет обертывать по умолчанию, хотя. Я не вижу, как использование BackgroundWorker не подходит. идеально подходящее средство выполнения долговременной задачи в потоке, отличном от UI, при управлении ходом/завершением в потоке пользовательского интерфейса.
добавлено автор Servy, источник

Вы можете запустить Thread, затем создать на нем новый экземпляр формы (без родителя), а затем запустить цикл сообщений (такой код находится в основном методе шаблона проекта). Помните, что любая форма (как правило, любой объект GDI) может использоваться только для потока, который ее создает. Например, вы не можете создать дочернюю форму в другом потоке, а затем в родительском. Каждый поток GUI должен запускать цикл сообщений.

0
добавлено
Наличие нескольких потоков пользовательского интерфейса - это плохая идея very , и ее нужно делать только в случае крайней необходимости. Здесь это не нужно.
добавлено автор Servy, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot