2015-04-20 2 views
3

Я работаю с WinForms. Я столкнулся со следующей проблемой. Я должен динамически создавать и добавлять на две вкладки в конкретный период времени.Добавить компоненты в форме асинхронно

Это основной макет

IMainGeneralReportForm mainGeneralReportLayoutForm = 
     ObjectFactory.GetOrCreateView<IMainGeneralReportForm>(); 

Я пытаюсь добавить свои элементы в следующем виде:

ObjectFactory.ShowView<IGeneralReportSimpleView>(); 
    ObjectFactory.ShowView<IGeneralReportAdvancedSearchView>(); 

Методы ShowView работает отлично. Но когда я вызываю методы один за другим, производительность программы немного медленная. Поэтому я решил использовать многопоточность в следующем виде:

 MainGeneralReportForm generalReportForm = mainGeneralReportLayoutForm as MainGeneralReportForm 
generalReportForm.Invoke(new SimpleViewDelegate(() => 
      { 
       return ObjectFactory.ShowView<IGeneralReportSimpleView>() 
      })); 

generalReportForm.Invoke(new AdvancedViewDelegate(() => 
      { 
       return ObjectFactory.ShowView<IGeneralReportAdvancedSearchView>() 
      })); 

    private delegate IGeneralReportSimpleView SimpleViewDelegate(); 
    private delegate IGeneralReportAdvancedSearchView AdvancedViewDelegate(); 

Эти подходы работают одинаково. Не могли бы вы дать мне совет, как решить эту проблему при многопоточности?

+0

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

ответ

1

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

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