2014-02-12 3 views
2

Я думаю, что ответ отрицательный. Я проверил аналогичные вопросы о stackoverflow, но они, похоже, идут в разных направлениях, основываясь на том, что необходимо для конкретных решений (но, возможно, что-то пропустило).В WinForms, возможно ли более одного потока в пользовательском интерфейсе?

Возможно ли иметь более одного потока пользовательского интерфейса в приложении WinForms? Я рефакторинг и задаюсь вопросом, следует ли мне использовать ConcurrentDictionary или Dictionary, к которым можно получить доступ из тех потоков, которые обращаются к формам. Это для большей части кода с несколькими разработчиками/дизайнами, и я хочу сделать выбор максимально прочным (но не над его инженером). Поскольку я ищу общий ответ, специфика не в этом вопросе, хотя они обычно есть. Спасибо за то, что посмотрели, и любая помощь - очень ценится.

+2

Ответ да, хотя это редко делается. У вас может быть отдельный поток для каждой формы (хотя у каждого элемента управления будет только один связанный поток пользовательского интерфейса). http://dotnetbeyond.blogspot.com/2011/10/multiple-ui-threads-in-winforms.html – Douglas

ответ

3

Да, это вполне возможно, если вам нужно. Ниже приведен пример формы, которая нерестится темы с новыми экземплярами того же вида:

public partial class Form1: Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Thread t = new Thread(ThreadProc); 
     t.Start(); 
    } 

    static void ThreadProc() 
    { 
     Application.Run(new Form1()); 
    } 
} 

Но, проектирование многопоточных GUI не обязательно является хорошей идеей. Вы должны понимать последствия. Предлагаю вам прочитать the MSDN article about the subject. Это с 1993 года, однако только устаревшие части касаются миграции из окон 3.1.

+0

Спасибо за пример и ссылку на статью! – Buck

4

Да, это может быть сделано, но обычно это неправильно. Multiple UI Threads - Winforms

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

, для любого достаточно продвинутого приложения будут несколько потоков, отличных от UI.

Потому что вы спрашиваете в контексте безопасности потоков, я бы предложил сохранить шаблоны MVVM и MVP. Если ваша структура живет в представлении, Presenter или ViewModel, она не требует безопасности потоков. Модель часто живет или разговаривает с другим потоком - например, если это база данных или оболочка по базе данных. Таким образом, безопасность потоков обычно является частью дизайна Модели или частью сообщения Модели с ViewModel/Presenter.

См MVVM: Tutorial from start to finish?, What are MVP and MVC and what is the difference?

+0

Я бы не сказал, что это «обычно неправильно» для использования нескольких потоков пользовательского интерфейса. Сегодняшняя тенденция состоит в том, чтобы распараллелить даже пользовательский интерфейс. Современные веб-браузеры создают новый поток (или даже процесс) для каждой вкладки; нет причин, по которым другие приложения не должны делать то же самое. – Douglas

+0

Использование независимого процесса для каждой вкладки выполняется для защиты их друг от друга, что является основным преимуществом. Преимущество простого использования дополнительного потока пользовательского интерфейса намного меньше, чем пользы от другого процесса (который может быть поврежден и перезагружен по своему усмотрению), например, для обеспечения доступа к устаревшим функциям. Я только что видел более неправильные примеры, чем правильные примеры, поэтому я говорю, что это обычно неправильно, но я согласен, что это мнение. – Peter

+0

Спасибо за хороший ответ! Хотелось бы добавить более 1. – Buck

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