From: Andrus on 17 Nov 2009 14:31 I tried code below but assertion fails since col value has changed . How to fix this code so that BeginInvoke is called with definition time col value in for loop ? Andrus. partial class MyUserControl : UserControl public CreateFields() { foreach (FormField col in MyFields ) { if (col.Andmeklass == "Kiirvalik") { Dispatcher.BeginInvoke(() => { Debug.Assert(col.Andmeklass == "Kiirvalik"); col.LoadPickListToCacheAsync(); }); } } } }
From: Peter Duniho on 17 Nov 2009 19:49 Andrus wrote: > I tried code below but assertion fails since col value has changed . > > How to fix this code so that BeginInvoke is called with definition time > col value in for loop ? [...] The "col" variable in your loop exists outside the scope of the loop block, and thus for the purposes of capturing in your anonymous method is instantiated only once. Each anonymous method delegate dispatched by BeginInvoke() is using the same variable. Thus, its value may change before the delegate can be invoked. You've got two options: -- Use Dispatcher.Invoke() instead, so that the anonymous method's execution is guaranteed to complete before the loop variable changes -- Declare a new variable inside the loop, assigned to the value of the loop variable, and then use that new variable in your anonymous method instead of the loop variable Personally, I would prefer the former approach. Only if there's some absolute necessity in allowing the anonymous method to be dispatched asynchronously would I introduce a new variable to the loop. Pete
|
Pages: 1 Prev: Accent insensitive Next: Run SQL Script from Console application |