Laden...

LightCore - ResolveAll<T>().ToArray() wirft InvalidOperationException

Erstellt von Uwe81 vor 13 Jahren Letzter Beitrag vor 13 Jahren 8.225 Views
U
Uwe81 Themenstarter:in
282 Beiträge seit 2008
vor 13 Jahren
LightCore - ResolveAll<T>().ToArray() wirft InvalidOperationException

Hallo!

Folgender Code verursacht eine Exception


    interface IFoo { }
    class Foo : IFoo { }

    interface IBar { }
    class Bar : IBar {
        public Bar(IEnumerable<IFoo> foos) { }
    }

    public class MainClass {
        public static void Main() {
            var builder = new ContainerBuilder();
            builder.Register<IFoo, Foo>();
            builder.Register<IBar, Bar>();

            IContainer container = builder.Build();
            container.ResolveAll<IBar>().ToArray();
        }
    } 

Im Aufruf von ToArray kommt die InvalidOperationException
"Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden."

Stacktrace


   bei System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
   bei System.Collections.Generic.Dictionary`2.ValueCollection.Enumerator.MoveNext()
   bei System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
   bei System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   bei System.Linq.Enumerable.<CastIterator>d__aa`1.MoveNext()
   bei System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   bei System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   bei Example.MainClass.Main() in C:\XXXXXX\MainForm.cs:Zeile 30.
   bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   bei System.Threading.ThreadHelper.ThreadStart()

Verwendete Version:
Download von der Homepage: LightCore-1.4.1-net-3.5.zip

Viele Grüße,
Uwe

5.941 Beiträge seit 2005
vor 13 Jahren

Hoi Uwe

Ich habs mal kurz angeschaut (Ohne Debugging).
Der Fehler tritt nur auf, wenn ein "IBar" registriert ist, ab einer Anzahl von mehr als 1 läufts.

Melde mich später wieder, wenn ich den Fehler gefunden habe 😃.

Jetzt schon vielen Dank für die Rückmeldung!

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

U
Uwe81 Themenstarter:in
282 Beiträge seit 2008
vor 13 Jahren

Der Fehler tritt nur auf, wenn ein "IBar" registriert ist, ab einer Anzahl von mehr als 1 läufts.

Ahh, das erklärt, warum der Fehler bei mir plötzlich aufgetaucht ist (und wie ich ihn einfach umgehen kann...)

Vielen Grüße,
Uwe

5.941 Beiträge seit 2005
vor 13 Jahren

Hallo Uwe

Der Bug ist gefixt und ins SVN Repository eingecheckt.
Wenn alle bekannte Bugs gefixt worden sind, gibt es einen neuen Release.

Fixed ResolveAll throws InvalidOperationException bug.
see: (LightCore - ResolveAll<T>().ToArray() wirft InvalidOperationException).

Beschreibung:
Wieso das es mit nur einer Registrierung krachte, jedoch mit zwei nicht, ist mir immer noch ein Rätsel.
Das Verhalten sollte eigentlich bei beiden das gleiche sein.

Ich konnte es auch nachvollziehen, jedoch nach meiner Änderung nicht mehr.

Schlussendlich lag es daran, das beim Aufruf von ResolveAll, ein bis mehrmals intern Resolve aufgerufen wird und dieser Aufruf die Auflistung mit den Registrierungen geändert hat (Registrierung hinzugefügt).

Die Lösung war, die Enumeration am Anfang von ResolveAll per .ToList() zu kopieren, sodass die sich nicht in die Quere kommen, d.h. es egal ist, wenn die Original Enumeration geändert wird.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

U
Uwe81 Themenstarter:in
282 Beiträge seit 2008
vor 13 Jahren

Hallo Peter!
Vielen Dank für deine Nachtschicht! Werde gleich ein SVN-Update machen.

Viele Grüße,
Uwe