Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Peter Bucher
Thema: Ist es richtig, dass ein DI Framework mir meine 'vorinstallierten' Dependencies direkt injected?
Am im Forum: Rund um die Programmierung

Hallo

Umkehrung der Kontrolle für die Objektinstanziierung einer Implementation, die registriert wird. Anstelle irgendwo innerhalb der Klasse ein "new MyImplementation()" zu machen, wird dies ausserhalb vom Dependency Injection Container gemacht.
Die Instanz kommt in das Objekt von aussen, nicht die Instanz wird im Objekt das diese benötigt instanziert. So hast du keine Abhängigkeiten mehr auf Implementationen (Klassen), sondern nur noch auf Abstraktionen (meinst ein Interface oder auch eine abstrakte Klasse, selten eine konkrete Oberklasse).


Gruss Peter

Thema: Snake Body soll Kopf folgen
Am im Forum: Grundlagen von C#

Hallo Jan_kie

Du kannst dir mal ein altes Beispiel von mir anschauen:
- Mein erstes Spiel: Snake Klon mit GDI+ (Mit Quellcode)

(DoublebufferedPanel einfach durch das WindowsForms "Panel" ersetzten).


Gruss Peter

Thema: Art der Dateiverwendung beim Öffnen analysieren
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Krumnix

Es gibt auch eine API für C#, um GIT per Code zu steuern.
Schau mal hier: https://github.com/libgit2/libgit2sharp


Gruss Peter

Thema: XML Datei in CSV wandeln mit LINQ gibt NullReference-Exception
Am im Forum: Grundlagen von C#

Hallo RevangeXX

Ich würde auch schauen, dass du die Doppeltungen der Keys, bspw. von "workingPeriod" loswirst.
Du lädst dieses Element einmal in eine Variable und kannst dann davon Untereelemente abfragen.


Gruss Peter

Thema: Kann ich ein Dictionary über Klassen hinweg gleich halten?
Am im Forum: Grundlagen von C#

Hallo Frokuss

Zu out / ref kriegst du hier ausführlichere Informationen :
- [Artikel] Parameter-Übergabemechanismen: call by value vs. call by reference (ref/out)
- Artikel - Parameterübergabe in C# (by value, by reference und out)


Gruss Peter

Thema: Visual Studio - Fehler beim erstellen eines ASP.Net Projekts
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo Repac3r

Evtl. könnte es sein, dass du VS als Administrator öffnen musst. Obwohl mir genau dieser Fehler dabei noch nie unterlaufen ist. Einen Versuch ist es wert.


Gruss Peter

Thema: ASP.net WebForms - Konstruktor oder Page_Load()
Am im Forum: Web-Technologien

Hallo ErikM

Im Konstruktor sind bspw. die Controls noch nicht initialisiert.
ASP.NET Webforms hat ein Lebenszyklus, nach dem alles abläuft und man sich reinhängt um Dinge zu erledigen.

Siehe:
- ASP.NET Page Life Cycle Overview


Gruss Peter

Thema: Unregelmässige ThreadAbortException; was ist die Ursache?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen

Das ThreadAbort-Problem konnte ich beheben indem das Timeout hochgestellt wurde. Das reichte allerdings nicht: McAfee Enterprise hat ab und an die web.config angefasst, sodass die Applikation ab und zu wieder beendet wurde.

Bis man mal darauf kommt!


Gruss Peter

Thema: Convert object[] to T[]
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo

Zitat von brainwave
Mit "funktioniert nicht" war "arr bleibt weiterhin object[]" gemeint. Oben bereits erwähnt.
Ja, weil du es dem Typ "Array" zuweist, der darunterliegend ein object[] ist, untypisiert.


Gruss Peter

Thema: Convert object[] to T[]
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen

@herbivore Man muss ja den Typ nicht ändern, nur den Zugriff darauf per Cast. Der unterliegende Typ muss natürlich tatsächlich ein Foo sein.

LINQ hat ein .Cast<T>, damit funktionierts, bei den beschriebenen Bedingungen.


object[] foos = new Foo[] { new Foo(), new Foo(), };
Foo[] finalyFoos = foos.Cast<Foo>().ToArray();


Gruss Peter

Thema: Generischen Typ-Parameter darstellen, bevor er existiert
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Palladin007

Schau mal hier: What exactly is an “open generic type” in .NET?

Evt. suchst du Type.GetGenericTypeDefinition().
Stichworte: Open generic type, closed generic type. Lies dich da mal ein.


Gruss Peter

Thema: Unregelmässige ThreadAbortException; was ist die Ursache?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Abt

Zitat von Abt
Wenn der Request zu lange dauert brechen die meisten Browser die Anforderung ab.
Da lohnt sich dann das Auslagern in extra LR-Threads. ABER: die Gefahr, dass diese abschmieren, ist riesig. Recycle, Restarts könne ja oft auftreten (zB Config geändert).
Ich verwende selbst LR-Threads so wenig wie möglich und lager das ganze auf Windows Services aus. Die kommunizieren dann mit der Webanwendung und übernehmen die LR-Threads.
Ich konsumiere die Services wieder mit .NET. Nicht direkt über Browser, sondern über einen Client. Aber auch dort gibt es das "störende", fixe Timeout. Darum kappe ich die Verbindung sofort wieder mit Auslagern und einer ID-Rückgabe.
Nächster Schritt für mich zum testen ist auch die Auslagerung in SelfHosting App oder Windows Service, um deine genannten Punkte ausschliessen zu können.

Danke für den Tipp bezüglich Extension für IIS 7.5, wusste ich nicht, könnte sich noch als nützlich erweisen.


Gruss Peter

Thema: Unregelmässige ThreadAbortException; was ist die Ursache?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hoi Abt

Zitat von Abt
Also wenn der Request 2 Stunden dauert dann klappt das. Auslagern und 2 Stunden rennen lassen glaube ich nicht. Bin mir aber nicht sicher.
Es gibt ab IIS 8 eine Extention "Application Initialization", wodurch Du im Menü eine "Start Mode = AlwaysRunning" Option hast. Für 7.5 ist sie über den Wep Plattform Installer nachinstallierbar.
Also ich habe die Erfahrung gemacht, dass wenn der Request lange läuft, dann Probleme aufgetaucht sind.
Daher habe ich ja die langlaufende Methode überhaupt erst in einen Thread ausgelagert und den Request nur eine ID zurückgeben lassen, womit ich auf den Status zugreifen kann. So traten die Probleme nicht mehr auf, die ich vorher hatte.

Das AlwaysRunning ist meines Wissens nur dazu da, falls der AppPool recycled wurde oder noch kein einziger Request stattgefunden hat, die Anwendung warmzustarten, sodass es nicht beim ersten Request oder beim ersten Request innerhalb des Idle-Timeouts eine Verzögerung auftritt.

Wenn das so wäre, würde das ja bei meinem Problem nicht wirklich helfen, sondern wäre nur eine Verbesserung.


Gruss Peter

Thema: Unregelmässige ThreadAbortException; was ist die Ursache?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen

Könnte es einen Unterschied bezüglich meinen Problemen machen, ob ich die übliche Thread-Klasse nutze, oder die neueren Task-Klassen?


Gruss Peter

Thema: Unregelmässige ThreadAbortException; was ist die Ursache?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Abt

Zitat von Abt
Der IIS räumt nur automatisch weg, wenn auf den Service länger als die Idle Time (Default: 20Min) des AppPools kein Zugriff erfolgt ist.
Mit dem IIS 7.5 wird aber erkannt, ob ein Request (Dein 2 Stunden Ding) noch aktiv ist oder nicht - dann wird auch nicht weggeräumt.
Aktiv ist der AppPool nur, wen innerhalb von 20min wieder Requests reinkommen, oder auch, wenn eine langlaufende Methode in einem anderen Thread läuft?

Der Service läuft auf einem IIS 7.5.
Zitat von Abt
Du kannst bei Tasks aber sowas mitgeben:

task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted);
, sodass Exceptions von Tasks besser abgefangen werden.
Danke für den Tipp.
Zitat von Abt
Für mich sieht das so aus (weil Du Tasks verwendest), dass die AbortException nicht von Deinem Code, sondern von den Komponenten kommt. Vielleicht arbeiten die unverträglicherweise mit Threads.
Oder aber es ist wirklich ein Task-Fehler, der ebenfalls durch die Background-Eigenschaft als Thread läuft.
In meinem Code benutze ich an keiner Stelle Thread.Abort(), also wird es wohl von der Komponente kommen.

Dein zweiter Satz verstehe ich nicht. Meinst du damit dass irgendeine Exception die Auftritt, dann durch die Task-API als ThreadAbortException weitergeworfen wird?

Schaue mir auch mal die Ereignisanzeige an.


Danke für eure Hilfe bisher.


Gruss Peter

Thema: Unregelmässige ThreadAbortException; was ist die Ursache?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen

Bei einem WCF Service der im IIS gehostet ist, treten unregelmässig ThreadAbortException`s auf.
Der Stacktrace zeigt mir auch, wo dieser auftritt. Zweimal war er an einem Ort, wo ich eine Komponente (https://magick.codeplex.com/) benutze, um Bilder zu bearbeiten.

Also dachte ich zuerst, es liege wohl daran und genau an diesem Ort. Nur war komisch, das monatelang alles lief und in Verbindung mit der Komponente nie ein Fehler auftrat.

Erst kürzlich trat der Fehler auch an einer anderen Stelle auf, die in überhaupt keiner Beziehung zu der Bildbearbeitungskomponente steht.


Mir ist nicht ganz klar, unter welchen Umständen die ThreadAbortException geworfen wird.
Fangen kann man sie zwar, aber dann wird sie anschliessend wieder geworfen. Was mit anderen Exceptions, die auch schon aufgetreten sind, nicht der Fall war.

Kurze Erklärung: Eine WFC-Methode wird aufgerufen und innerhalb von dieser kommt folgender Aufruf, um die Arbeit in einem eigenen Thread laufen zu lassen. Anschliessend kommt die WCF-Methode an ihr Ende und hat dann auch keine Verbindung zum Client mehr.


Task.Factory
    .StartNew(() => this.Sync(0, syncTaskStatus), TaskCreationOptions.LongRunning)
    .ContinueWith(task => blSyncTaskInstance.SetFinished(syncTaskId));

Die Methode "this.Sync(0, status)" läuft ca. 2 Stunden.

Ist es jetzt so, dass immer eine ThreadAbortException im Anschluss geworfen wird, wenn irgend eine Exception innerhalb des besagten Threads auftritt?
Oder kann es auch sein dass diese Exception auftritt, weil z.B. der IIS (Host) den ApplicationPool abräumt / oder Timeout, also durch einen externen Einfluss, der den Thread beendet?

Rekonstruktion im lokalen Entwicklersystem ist schwierig. Dort lief der Hintergrundtask sogar mehrere Stunden, ohne das ein Fehler auftrat.

Folgend eine Auswahl an Exceptions die auftreten:
Fehler
'System.Threading.ThreadAbortException: Thread was being aborted.
at Magick.Image.write(Image* , Blob* )
at ImageMagick.MagickWriter.Write(Image* image, Blob* blob)
at ImageMagick.MagickWriter.Write(Image* image, Stream stream)
at MyCompany.Libs.MyLib.Sync.Actions.ResizeAction.ExecuteAction(Stream sourceStream)
Fehler
'System.Threading.ThreadAbortException: Thread was being aborted.
at Magick.Image.resize(Image* , Geometry* )
at ImageMagick.MagickImage.Resize(MagickGeometry geometry)
at MyCompany.Libs.MyLib.Sync.Actions.ResizeAction.ExecuteAction(Stream sourceStream)
at MyCompany.Libs.MyLib.Sync.SyncFolder.GetStreamChainResult(Stream sourceStream, List`1 preCopyActions)

Durch Webdav-Komponente...
Fehler
'System.Exception: System.Threading.ThreadAbortException: Thread was being aborted.
at System.Net.UnsafeNclNativeMethods.OSSOCK.recv(IntPtr socketHandle, Byte* pinnedBuffer, Int32 len, SocketFlags socketFlags)
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, SocketError& errorCode)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)
at System.Net.ConnectStream.ProcessWriteCallDone(ConnectionReturnResult returnResult)
at System.Net.ConnectStream.CallDone(ConnectionReturnResult returnResult)
at System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting)
at System.Net.ConnectStream.System.Net.ICloseEx.CloseEx(CloseExState closeState)
at System.Net.HttpWebRequest.EndWriteHeaders_Part2()
at System.Net.HttpWebRequest.EndWriteHeaders(Boolean async)
at System.Net.HttpWebRequest.WriteHeadersCallback(WebExceptionStatus errorStatus, ConnectStream stream, Boolean async)
at System.Net.ConnectStream.WriteHeaders(Boolean async)
at System.Net.HttpWebRequest.EndSubmitRequest()
at System.Net.Connection.SubmitRequest(HttpWebRequest request, Boolean forcedsubmit)
at System.Net.ServicePoint.SubmitRequest(HttpWebRequest request, String connName)
at System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint)
at System.Net.HttpWebRequest.GetResponse()
at Independentsoft.Webdav.Resource.GetInputStream(String address)


Gruss Peter

Thema: Team Foundation Server API: Nicht mehr vorhandene Dateien erkennen und diese auf Server löschen
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo zusammen

Die Lösung war vom "Server Workspace" auf "Local Workspace" umzuschalten. So verhält sich der TFS näher an GIT / Mercurial und erkennt lokale Änderungen, ohne explizites Löschen per Source Control Explorer oder VS.

Die Änderungen müssen dann zuerst noch promoted werden, damit man sie einchecken kann.

Der Code um zu promoten:


PendingChange[] candidates;
workspace.GetPendingChangesWithCandidates(
    new ItemSpec[] { new ItemSpec(@"C:\Local\Path", RecursionType.Full) },
    false,
    out candidates);

foreach (PendingChange pc in candidates)
{
    if ((pc.ChangeType & ChangeType.Delete) == ChangeType.Delete)
    {
        workspace.PendDelete(pc.LocalItem);
    }
    else if ((pc.ChangeType & ChangeType.Add) == ChangeType.Add)
    {
        workspace.PendAdd(pc.LocalItem);
    }
    else
    {
        workspace.PendEdit(pc.LocalItem);
    }
}

PendingChange[] changes = workspace.GetPendingChanges();

/* Now you can review and CheckIn your changes. */

Folgend das Posting mit der Antwort auf Stackoverflow:
- Detect file delete changes with TFS API (automated, without VS interaction)


Gruss Peter

Thema: Team Foundation Server API: Nicht mehr vorhandene Dateien erkennen und diese auf Server löschen
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo zusammen

Ich arbeite an einer Automatisierung per TFS-API. Dabei geht es um einen Ordner der Unterordner und Dateien enthält.

Diese Inhalte werden einmal initial eingecheckt. Anschliessend wird der Inhalt es lokalen Ordners gelöscht und die Inhalte neu hineingeschrieben. Dabei kommt es vor, das Dateien die vorher enthalten waren, jetzt nicht mehr vorhanden sind.
Diese lokal gelöschten Dateien sollten jetzt irgendwie erkannt werden und auf dem Server dann gelöscht werden.
In SVN oder anderen Systemen gibt es sogenannte "missing files", mit denen dann etwas angefangen werden kann. Im TFS scheint so etwas nicht zu existieren.

Meine Frage dabei ist, ob es eine Möglichkeit ist, lokal gelöschte Dateien (und Ordner) per TFS-API zu erkennen und dem Server dann mitzuteilen, das diese gelöscht werden sollen.

Hintergrund ist folgendes:
Ich generiere aus dem SQL Server Create-Scripte für alle Objekte in einen Ordner und möchte so automatisch eine Art History im TFS ablegen.
Wenn jetzt ein Objekt im SQL Server entfernt wird, wird das Script dann auch nicht mehr generiert.

Da ich nicht explizit etwas lösche, kann ich auch nicht einfach per API ein Delete absetzen. Ich müsste das Vorher-Nachher vergleichen, um dies anzustellen.

Vielleicht gibt es ja auch eine andere Möglichkeit mein Ziel zu erreichen.
Hat jemand dazu eine Idee?


Gruss Peter

Thema: (Generische) Methode für Unterelemente erneut aufrufen (und nach dem Typ der Objekte unterscheiden)
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo ThomasE.

Wie schon geschrieben, über den OpenGenericType.


valueType.GetGenericTypeDefinition() == typeof(LinkedList<>)
valueType == typeof(LinkedList<int>) (Wenn int)

Type.MakeGenericType(openType, new Type[] { typeArg1 });


Gruss Pete

Thema: (Generische) Methode für Unterelemente erneut aufrufen (und nach dem Typ der Objekte unterscheiden)
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo ThomasE.

Wenn du den Type hast, kannst du Type.GetGenericTypeDefinition-Methode benutzen, um an den OpenGenericType zu kommen, also die generische Definition ohne Typpparameter.

Für die Argumente jeweils: Type.GetGenericArguments Method

Je nach dem, wie du die Infos im XML gespeicherst hast, kannst du den Typ gar nicht mehr rekonstruieren.


Gruss Peter

Thema: Zugriff, Ändern von Werte im ItemTemplate
Am im Forum: Web-Technologien

Hallo icolor

Schau mal hier: ListView.ItemDataBound


Gruss Peter

Thema: Index ausserhalb des Arraybereichs / Archivierung von Ordnern
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Versani

300 ist statisch. Nimmt doch dort directories.Length.
Denn wenn es mal weniger als 300 sind, kommt natürlich der genannte Fehler, weil der Array dann kleiner ist.


Gruss Peter

Thema: Auswahl eines Setup-Programmes für die eigene Applikation
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo Bernd

Zu deiner Liste könnte man noch NSIS und Inno Setup hinzufügen.
- http://nsis.sourceforge.net/Main_Page
- http://www.jrsoftware.org/isinfo.php


Gruss Peter

Thema: Outlook Ordner Rekursion Problem
Am im Forum: Office-Technologien

Hallo Jonathan

Benutze beim Debuggen Breakpoint Condition und HitCount, das hilft.
Rechtsklick auf den Breakpoint und dann auswählen, siehe:
- Unbeschwertes Debugging von WebApps und Breakpoint Condition

Condition ist eine Bedingung, bei der er hält (z.B. test.ID == "haus"), Count ist, nach X mal, breaken.


Gruss Peter

Thema: SQL-Server 2012 Datenbanken bearbeiten: welches Tool?
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo Maddinel

Schau mal auf dieser Seite:
- How to install SQL Server Management Studio 2012 (SSMS) Express?

Ich hatte das Problem letztens auch mal.
Bei mir ging es mit SQLManagementStudio_x64_ENU.exe.

Es geht die Installation des SQL-Servers aus und ein paar Seiten später siehst du dann Features.
Dort einfach alles anhaken, damit das MMS auch mitkommt.


Gruss Peter

Thema: List Update via Linq
Am im Forum: Datentechnologien

Hallo unconnected

Ja, oberflächlich gesehen schon. Allerdings werden die LINQ-Statements intern dann in Methodenaufrufe und Lambda-Expressions gewandelt.

Es sind zwei Schreibweisen aber beides ist LINQ. Hier im speziellen Linq To Objects.


Gruss Peter

Thema: [gelöst] Klassenbibliothek: Funktions- und Parameter-Beschreibungen pflegen
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo Gnozo

Nutze dafür die XML-Kommentare für Typen, Methoden, ...
Diese werden dann genutzt, um die Tooltips anzuzeigen.


Gruss Peter

Thema: Bilder vergleichen: Ähnlichkeit feststellen, auch wenn der Bildausschnitt etwas verschoben ist
Am im Forum: Grafik und Sound

Hallo zusammen

Für die Ähnlichkeitsanalyse habe ich gute Erfahrungen mit folgender Bibliothek gemacht:

- https://github.com/jforshee/ImageHashing

Da bekommt man einen prozentualen Ähnlichkeitswert.


Gruss Peter

Thema: Weshalb var anstelle des konkreten Datentyps verwenden?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo weismat

Ja empfohlen unter bestimmten Bedingungen und davon abgeraten auch unter bestimmten Bedingungen.

Wäre noch wichtig zu erwähnen.


Gruss Peter

Thema: Weshalb var anstelle des konkreten Datentyps verwenden?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen

Meines Wissens wurde var wirklich nur für das Feature "Anonymous Types" eingeführt.

Man kann es so sinnvoll nutzen oder eben auch missbrauchen.
Einige Dinge sind schon genannt worden, die ich auch in einem Blogpost von mir beschreibe.

Ich nutze var nur bei anonymen Typen, ausser bei ein paar Ausnahmen, bei denen ich die Verwendung angebracht finde.

- Alles var oder nicht?


Gruss Peter