glopezz
asked on
Windows Forms application hangs
Hi Experts!
I am programming an application that gets information of a company contract. The process is:
1- Connects to an XML web service to get data about a contract.
2- Makes an SQL database insertion with this information.
3- Opens Excel to do insertions and read outputs from a document.
4- Closes Excel
5- Shows information in a datagrid in the Windows Form.
When I run the process to get information for one contract, everything works fine. However, now I need to get information from multiple contracts, so I added a timer that fetches every contract in a listbox, runs the process for all contracts, waits 5 seconts and then repeats it again and again.
The application is hanging and crashes, no errors, it just hangs with the sandclock icon and stops working.
I was wondering if anyone had a clue on how to avoid this, maybe refreshing the form after every timer cycle? Code is big and divided in several classes so posting it here might be tricky.
Thanks
glopezz
I am programming an application that gets information of a company contract. The process is:
1- Connects to an XML web service to get data about a contract.
2- Makes an SQL database insertion with this information.
3- Opens Excel to do insertions and read outputs from a document.
4- Closes Excel
5- Shows information in a datagrid in the Windows Form.
When I run the process to get information for one contract, everything works fine. However, now I need to get information from multiple contracts, so I added a timer that fetches every contract in a listbox, runs the process for all contracts, waits 5 seconts and then repeats it again and again.
The application is hanging and crashes, no errors, it just hangs with the sandclock icon and stops working.
I was wondering if anyone had a clue on how to avoid this, maybe refreshing the form after every timer cycle? Code is big and divided in several classes so posting it here might be tricky.
Thanks
glopezz
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
You would still need Application.DoEvents() to allow the Refresh() call to be processed...
...
Me.Refresh()
Application.DoEvents()
...
It gets more complicated when you thread things out because you are not supposed to update GUI components from a thread without using Delegates and the Invoke() methods.
Here is a simplified example...
(the worker sub can access anything in the class...but use Delegates to write/change to GUI components...Delegates are not necessary to READ GUI components though)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim T As New System.Threading.Thread(Ad dressOf Worker)
T.Start()
End Sub
Private Sub Worker()
' do something...
System.Threading.Thread.Sl eep(5000) 'simulated five second work
UpdateLabel(Label1, "threaded work complete")
End Sub
Private Delegate Sub LabelDelegate(ByVal lbl As Label, ByVal msg As String)
Private Sub UpdateLabel(ByVal lbl As Label, ByVal msg As String)
If Me.InvokeRequired Then
Me.Invoke(New LabelDelegate(AddressOf UpdateLabel), New Object() {lbl, msg})
Else
lbl.Text = msg
End If
End Sub
...
Me.Refresh()
Application.DoEvents()
...
It gets more complicated when you thread things out because you are not supposed to update GUI components from a thread without using Delegates and the Invoke() methods.
Here is a simplified example...
(the worker sub can access anything in the class...but use Delegates to write/change to GUI components...Delegates are not necessary to READ GUI components though)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim T As New System.Threading.Thread(Ad
T.Start()
End Sub
Private Sub Worker()
' do something...
System.Threading.Thread.Sl
UpdateLabel(Label1, "threaded work complete")
End Sub
Private Delegate Sub LabelDelegate(ByVal lbl As Label, ByVal msg As String)
Private Sub UpdateLabel(ByVal lbl As Label, ByVal msg As String)
If Me.InvokeRequired Then
Me.Invoke(New LabelDelegate(AddressOf UpdateLabel), New Object() {lbl, msg})
Else
lbl.Text = msg
End If
End Sub
ASKER
I have tried the Application.DoEvents, seems to work!
Just before accepting the answer:
What about a Me.Refresh? Could this help too?
Also, do you have a good reference or link to try option 2 (process loops into another thread)?
Thanks
glopezz