Problema alla chiusura del software

lunedì 15 settembre 2014 - 09.13
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows Server 2008 R2  |  Visual Studio 2010

pieroalampi Profilo | Expert

buongiorno e buon inizio settimana a tutti, ho un problema:
praticamente ho installato su un pc un software da me fatto in vb.net lo stesso sul mio pc che come s.0. Windows 7 32 bit va benissimo, ma sul pc di destinazione che ha come s.o. win 7 64 alla chiusura del programma mi presernta questo errore:
Le informazioni su come richiamare il debug JIT (Just-In-Time) anziché questa finestra
sono riportate in fondo al messaggio.

************** Testo dell'eccezione **************
System.InvalidOperationException: La raccolta è stata modificata. L'operazione di enumerazione potrebbe non essere eseguita.
in System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
in System.Collections.Generic.List`1.Enumerator.MoveNextRare()
in System.Collections.Generic.List`1.Enumerator.MoveNext()
in Microsoft.VisualBasic.PowerPacks.ShapeCollection.Dispose(Boolean disposing)
in Microsoft.VisualBasic.PowerPacks.ShapeContainer.Dispose(Boolean disposing)
in System.ComponentModel.Component.Dispose()
in System.Windows.Forms.Control.Dispose(Boolean disposing)
in System.ComponentModel.Component.Dispose()
in System.Windows.Forms.Control.Dispose(Boolean disposing)
in System.Windows.Forms.Form.Dispose(Boolean disposing)
in GestLaundry.FrmResocontoChiusura.Dispose(Boolean disposing)
in System.ComponentModel.Component.Dispose()
in GestLaundry.FrmResocontoChiusura.BtnChiudi_Click(Object sender, EventArgs e)
in System.Windows.Forms.Control.OnClick(EventArgs e)
in System.Windows.Forms.Button.OnClick(EventArgs e)
in System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
in System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
in System.Windows.Forms.Control.WndProc(Message& m)
in System.Windows.Forms.ButtonBase.WndProc(Message& m)
in System.Windows.Forms.Button.WndProc(Message& m)
in System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
in System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
in System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

da premettere che prima della chiusura della finestra principale all'evento della chiusura ho inserito una finestra di riepilogo con uno shodialog, ho provato a cambiare il processore nelle opzioni di compilazione ma niente non va!!!!


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LA PRIMA FRASE DI UN PROGRAMMATORE HELLO WORD ...... ANCHE L'ULTIMA

0v3rCl0ck Profilo | Guru

probabilmente oltre al cambio di sistema operativo, stai eseguendo l'applicazione con un framework diverso, più o meno aggiornato rispetto all'altro pc dove il tutto funziona, non mi ricordo bene, ma avevo letto che in una qualche versione del framework avessero cambiato alcuni comportamenti con le variabili closure abbinate ai cicli o lambda function, ad ogni modo puoi verificare che stiano eseguendo lo stesso identico framework.

di seguito le istruzioni per capire che versione di framework stai utilizzando: http://msdn.microsoft.com/it-it/library/hh925568.aspx

in ogni caso il messaggio di errore è chiaro, tenti di modificare o leggere una collezione mentre quest'ultima è già stata modificata, il caso classico è:

void Main() { var list = new List<string>(); list.Add("ciao"); list.Add("mondo"); foreach (var element in list) { list.Remove(element); } }

oppure se stai eseguendo un operazione di modifica in un thread separato:

void Main() { var list = new List<string>(); list.Add("ciao"); list.Add("mondo"); var t = new Thread(() => { Thread.Sleep(1000); // per fare sovrapporre questo thread all'esecuzione del foreach list.Add("zzzzz"); }); t.Start(); foreach (var element in list) { Console.WriteLine(element); Thread.Sleep(1000); // giusto per dare tempo all'altro thread di modificare la collezione } }

quindi ti consiglio comunque di rivedere il tuo codice, spesso questi problemi si risolvono semplicemente facendo una copia della collezione (la copia di una collezione di reference object è particolarmente veloce, perchè copia solo i riferimenti, quindi non preoccuparti di questa operazione):

void Main() { var list = new List<string>(); list.Add("ciao"); list.Add("mondo"); var t = new Thread(() => { Thread.Sleep(1000); // per fare sovrapporre questo thread all'esecuzione del foreach list.Add("zzzzz"); }); t.Start(); foreach (var element in list.ToList()) { Console.WriteLine(element); Thread.Sleep(1000); // giusto per dare tempo all'altro thread di modificare la collezione } }

come vedi è stato sufficiente aggiungere il .ToList() che implicitamente fa la copia del sotto array.

e anche l'altro esempio:

void Main() { var list = new List<string>(); list.Add("ciao"); list.Add("mondo"); foreach (var element in list.ToList()) { list.Remove(element); } }


Ciao!

Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

0v3rCl0ck Profilo | Guru

ecco quello di cui ti parlavo sul foreach e le closure:

http://kristofmattei.be/2013/04/26/foreach-now-captures-variables-access-to-modified-closure/

cito da link:

"
The compiler has changed (note that even for .NET 3.5, 4, and 4.5 in Visual Studio 2012 the 4.5 compiler is used!).

Meaning that our variable word is now declared inside of the foreach loop, and not outside.

This change can be found in the C# 5.0 spec, page 247-248, found on your machine when you’ve installed VS2012 (not Express) in: C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC#\Specifications\1033

If v was declared outside of the while loop, it would be shared among all iterations, and its value after the for loop would be the final value, 13, which is what the invocation of f would print. Instead, because each iteration has its own variable v, the one captured by f in the first iteration will continue to hold the value 7, which is what will be printed. (Note: earlier versions of C# declared v outside of the while loop.)

Note 1: read the file to get the meaning of ‘v’ and those values (like 13 and 7).
Note 2: I’ve tweeted to some guys to get the spec online.

While this is not necessarily a problem for projects coming from 2010 and upgrading to 2012, it can be an issue when you are doing round-tripping, for example in mixed teams. Developers using 2012 need to use the old behavior.
"


Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5