2014-01-31 2 views
0

У меня есть родительская форма VB.Net, которая должна создать несколько детей MDI.Как создавать формы MDI Child асинхронно?

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

Я пытаюсь создать ребенок MDI асинхронно, используя следующий код, но он замирает выполнять синхронно:

ParentForm.BeginInvoke(Sub() 
         CreateMDIChildForm() 
         End sub) 

Этот код выполняется, но он по-прежнему синхронный, и родительская форма замерзает.

Я попытался создать MDI в отдельном потоке, но затем я не могу присоединиться к форме, созданной в родительской форме.

У кого-нибудь есть идеи, пожалуйста?

Спасибо.

+0

Что вы делаете в случае загрузки? Эта часть все еще находится в потоке пользовательского интерфейса ... – LarsTech

+0

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

+0

Итак, самое длинное задание не выполняется в событии загрузки формы, но перед созданием форма –

ответ

0

Решение:

Dim Thread as new Thread(sub() 
           ParentForm.BeginInvoke(sub() 
                 CreateMDIChild() 
                 end sub) 
         end sub) 
Thread.Start() 

С этим, дочерняя форма MDI-прежнему создается в родительской форме, но все это делается в отдельном потоке.

0

я могу воспроизвести это с помощью следующего кода:

Public Class Form1 

    Private Sub Open(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     Me.BeginInvoke(Sub() Me.CreateMDIChildForm()) 
    End Sub 

    Private Sub CreateMDIChildForm() 
     Dim f As New Form2() 
     MsgBox("OK") 
    End Sub 

    Public Class Form2 
     Inherits Form 
     Sub New() 
      Thread.Sleep(5000) 
     End Sub 
    End Class 

End Class 

И исправление было бы что-то вроде этого:

Public Class Form1 

    Private Sub Open(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     If (Me.operationCompleted Is Nothing) Then 
      Me.operationCompleted = New SendOrPostCallback(AddressOf Me.CreateMDIChildFormCompleted) 
     End If 
     Me.asyncOperation = AsyncOperationManager.CreateOperation(Nothing) 
     Dim thread As New Thread(AddressOf Me.CreateMDIChildForm) 
     thread.Start() 
    End Sub 

    Private Sub CreateMDIChildForm() 
     Dim f As New Form2() 
     Me.asyncOperation.PostOperationCompleted(Me.operationCompleted, f) 
    End Sub 

    Private Sub CreateMDIChildFormCompleted(args As Object) 
     Dim f As Form = DirectCast(args, Form) 
     'TODO: Set mdi child, show window etc. 
     MsgBox("OK") 
    End Sub 

    Private asyncOperation As AsyncOperation 
    Private operationCompleted As SendOrPostCallback 

    Public Class Form2 
     Inherits Form 
     Sub New() 
      Thread.Sleep(5000) 
     End Sub 
    End Class 

End Class 
0

Рекомендуемый метод для устранения проблем, как это не попробовать для загрузки форм в отдельные потоки, а скорее для выполнения только трудоемкой работы в отдельном потоке.

В этом случае это означает, что вы должны загружать дочерние формы MDI, как правило, в одном и том же потоке пользовательского интерфейса, но внутри дочерних форм каждый из них запускает отдельный поток для выполнения связанной с БД работы, которая вызывает зависания. Таким образом, материал базы данных не приведет к зависанию формы загрузки. Форма будет загружаться и отображаться быстро, а затем работа с базой данных будет выполняться после того, как форма уже будет видна.

Возможно, вам придется отключить некоторые или все элементы управления дочерней формы до завершения работы базы данных. Вы также можете захотеть, чтобы дочерняя форма отображала какую-то анимацию вращения, чтобы показать, что она по-прежнему загружается. Самый простой способ реализовать отдельные потоки в пользовательском интерфейсе, для таких вещей - использовать компонент BackgroundWorker. Вы найдете его в разделе «Компоненты» в панели инструментов разработчика форм.

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