Cross Thread Operation not valid.

  • Thread starter Thread starter Bob
  • Start date Start date
B

Bob

Hi,
Moving a project from .net 2003 -> 2005 Beta 2
Windows App. Main Window is start object.
Main window spawns a thread.
After doing some work this thread raises an interrupt.
The event carries a reference to the class that raised it plus an
instantiated, empty eventarg.
RaiseEvent LineStateChange(Me, e)

The 'RaiseEvent' errors in 2005 with Cross thread...

Any ideas on what is going on here?
Thanks
Bob
 
You should check if InvokeRequired is set on the ISynchronizeInvoke
interfaced of your event sink before raising the event from a separate
thread. If this event sink requires synchronization, you'll need to call
Invoke instead. Here is some sample code of a OnTestEvent that implements
this.

Public Event TestEvent as EventHandler

Protected Overridable Sub OnTestEvent(ByVal sender As Object, ByVal args
As System.EventArgs)
If Not TestEventEvent Is Nothing Then
Dim singlecast As EventHandler

'Check each multi-cast delegate
For Each singlecast In TestEventEvent.GetInvocationList
Dim syncInvoke As System.ComponentModel.ISynchronizeInvoke
If TypeOf singlecast.Target Is
System.ComponentModel.ISynchronizeInvoke Then
syncInvoke = CType(singlecast.Target,
System.ComponentModel.ISynchronizeInvoke)
End If
If Not syncInvoke Is Nothing Then
If syncInvoke.InvokeRequired Then
syncInvoke.Invoke(singlecast, New Object() {Me, New
EventArgs})
Else
singlecast(Me, Nothing)
End If
End If
Next


End If


End Sub
 
Hi,
Thanks for the snippet.
Based on this and some other sample code I ended up hatching a delegate in
the main window and invoking the delegate in the worker thread.
regards
Bob
 
Hi,
As stated further down in this thread. (Oh No , that word again.) I have a
solution that involves the working thread invoking a delegate in the calling
thread (main Window.)
However this troubles me.
There seems to be too much coupling IMHO.
In .net 2003, rightly or wrongly, I could design my worker class without
prior knowledge of the calling class. It could be designed to do its work
then raise its Publicly declared event with its payload.
The event handler on the main window could be designed later.
Now it seems I have to know about the main form's delegate before I can
write the beginInvoke instruction in the worker class.
I hope I have got it wrong and someone can enlighten me. Otherwise this
seems a large leap backwards.
regards
Bob
 
Hi,
Please ignore this bleat.
I have actually read the documenation and found the correct 'uncoupled' way
of doing events.
Thanks
Bob
 
Back
Top