Как использовать Backgroundworker для загрузки формы?

Когда я пытаюсь загрузить форму с помощью класса backgroundworker, она выдает исключение, потому что я пытался получить доступ к объекту, который был создан другим потоком, а не текущим потоком. Как загрузить эту форму фоном?

(Я ищу индикатор выполнения marquee во время загрузки формы)

3
nl ja de
Вы не можете загрузить форму в рабочий поток. Загружайте данные, необходимые для инициализации формы.
добавлено автор Hans Passant, источник

4 ответы

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

Пример:

Private WithEvents bgwTasks As New BackgroundWorker

Private Sub bgwTasks_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwTasks.DoWork
e.Result= GetDatabaseTable()
End Sub

Private Sub bgwTasks_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwTasks.RunWorkerCompleted
    If e.Result IsNot Nothing Then
        DataGridView1.DataSource = e.Result
    End If
End Sub

Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If bgwTasks.IsBusy = False Then
        bgwTasks.RunWorkerAsync()
    End If
End Sub
1
добавлено

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

Public Class Form1
Dim form2 As Form2

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    form2 = New Form2()
    form2.TextBox1.Text = "Text"
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    form2.Show()
End Sub
End Class

Вы можете использовать событие ProgressChanged фонового работника для отчета в строке прогресса.

0
добавлено
спасибо, он выбрал исключение
добавлено автор AymAn AbuOmar, источник

Ты не сможешь это сделать. У форм есть Thread-Affinity. то есть. они могут ТОЛЬКО получать доступ к потоку, который создавал экземпляр формы. Вы фоновой нитью только что стали потоком пользовательского интерфейса для формы! Так что вы ДОЛЖНЫ сделать, это маршал вызова на правильную нить. Test InvokeRequired. Если true, создайте экземпляр делегата, вызовите BeginInvoke и НЕМЕДЛЕННО возвратитесь. Теперь вызов будет привязан к правильной нити.

0
добавлено

Это отключит проверку Cross Threads

Me.CheckForIllegalCrossThreadCalls = False

Я по-прежнему предлагаю вам искать Cross Thread относительно правильного использования класса BackgroundWorker.

0
добавлено
Наверное, не лучший совет. См. CheckForIllegalCrossThreadCalls .
добавлено автор LarsTech, источник
Да, я знаю. Я просто хочу, чтобы он увидел, что код работает. Вот почему я предлагаю найти подходящий способ использования класса backgroundworker.
добавлено автор Ruben_PH, источник
Как я вижу ваш код выше, ответ - нет.
добавлено автор Ruben_PH, источник
вы положили его на мероприятие Form Load?
добавлено автор Ruben_PH, источник
Спасибо, мужчина, но если я использую это, это вызовет проблемы?
добавлено автор AymAn AbuOmar, источник
я попробовал это, он выбрал исключение
добавлено автор AymAn AbuOmar, источник
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

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

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

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

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

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)