я написал приложение winforms на VB .NET в Visual Studio 2010

Мне нужно запустить создание потока в коде. В form1 у меня есть кнопка, которая запускает новый отдельный поток для обработки некоторых данных, поэтому мне это нужно, чтобы не замораживать форму.

У меня есть инициализированный поток:

dim th as thread = new thread (addressof elaborate)

И в событии button.click:

th.isbackground= true
th.start()

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

Любые идеи?

(я ничего не нашел в Интернете, только При использовании многопоточности появляются несколько значков уведомлений)


person Inconsapevole    schedule 24.09.2011    source источник
comment
Не отображать формы в рабочих потоках. Используйте BackgroundWorker для выполнения кода, который требует времени и приводит к зависанию пользовательского интерфейса.   -  person Hans Passant    schedule 24.09.2011
comment
@cHao Я уже прочитал ответ, но не понял, как решить проблему. Я заметил, что проблема решена, если я удалю любой вызов формы. Но как в таком случае вызвать подпрограмму по форме?   -  person Inconsapevole    schedule 25.09.2011


Ответы (1)


Создайте внутри этого класса класс под названием Elab, поместите подзаголовок под названием work Добавьте в форму таймер, который отключен

с тиком, скажем, 1000

Объявите это в своем классе формы:

Dim El as Elab

внутри Form_Load () поместите:

El = New Elab()

Под вашей кнопкой поместите это:

Dim gThread as new System.Threading.Thread(Address of El.Work)
Timer1.Enabled = True

Внутри Elab объявите переменную с именем Result:

Public Result as boolean

Когда elab завершит все, что делает, установите для результата значение true и сохраните результаты в общедоступных переменных, к которым вы сможете получить доступ позже.

Внутри таймера:

If El.Result = True then
   'Get results, deal with data
end if

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

Помните: если вам нужно, чтобы Elab завершил работу до того, как можно будет продолжить определенную часть кода (например, elab может добавить два числа, и вам нужен результат для продолжения), вы можете запустить поток и сделать следующее:

Do until El.Result = True
    Application.DoEvents()
    System.Threading.Thread.Sleep(1)
Loop

gThread.Join()

Надеюсь, это немного поможет.

Итак, ответ на ваш вопрос: не помещайте подпрограмму внутрь формы, вместо этого поместите ее в класс, экземпляр которого вы можете создать.

person Danny    schedule 25.09.2011