Peter Duniho
8/14/2008 1:29:00 AM
On Wed, 13 Aug 2008 17:17:13 -0700, eugen_nw
<eugen_newsgroups@hotmail.com> wrote:
> I did look under the hood and this method is calling
> Control.Invoke(). Digging deeper down I've stopped at the
> RuntimeMethodHandle._InvokeMethodFast() method whose code I cannot
> find.
>
> I know that the delegates invoked via Control.BeginInvoke() will use
> the window's message pump to send and retrieve the delegate and its
> arguments, so the control/form will not react to Windows messages
> while it is executing the delegate. That is the behavior I want to
> have as well when the delegate passed to
> WindowsFormsSynchronizationContext.Send() executes.
>
> For a bit of a background, I want to have this behavior in order to
> make sure that a grid control will not repaint itself while I'm re-
> populating the DataTable it is bound to. If you have other
> suggestions on how to ensure that the grid will not read from the
> DataTable at the same time a worker thread reloads it, please send
> them my way.
Well, the easiest way to block the GUI is to not run your code on the
worker thread in the first place. Just repopulate the DataTable from the
main GUI thread, and that will stop your entire GUI from working, avoiding
any chance that the user might see updates while you're changing the
DataTable.
Personally, I'm not a big fan of blocking the GUI. I don't really
understand why you don't want updates while the DataTable is being
repopulated. But why not just temporarily set the DataSource to null
while you update the DataTable and then set it back to your DataTable when
you're done? You could even put up a little "Reloading Data" TextBox over
the DataGridView control while the update happens.
Whatever your goals, I'm pretty sure you're barking up the wrong tree.
All this talk of "BeginInvoke()" and "SynchronizationContext", that stuff
isn't for blocking threads. It's for helping threads keep running. That
a method invoked using Control.Invoke() or Control.BeginInvoke() has the
ability to block the GUI thread is a side-effect and in fact one would
typically take pains to be careful about those methods to make sure they
_don't_ block the GUI thread for very long.
Pete