Hallo,
ich habe ein Programm geschrieben das jetzt schon ein paar Monate unterbrechungsfrei läuft.
Das Programm hat sich dabei immer weiter mit Speicher vollgezogen und hat inzwischen 1,6 GB an speicher unter beschlag. Ich habe mir einen Dump gemacht und den mit WinDbg analysiert (Was das angeht habe ich leider nur einen sehr begrenzten Wissensstand)
Wenn ich nun einen !dumpheap -stat ausführe sind die letzten Zeilen folgende
MT Count TotalSize Class Name
.
.
.
000007fee7852688 712 79744 System.Reflection.RuntimeMethodInfo
000007fee785f508 1011 80880 System.Collections.Hashtable
000007fee785e068 861 98300 System.Int32[]
000007fee78c19e0 1998 111888 System.Diagnostics.StackFrame
000007fee62c3550 1652 158592 System.Diagnostics.NtProcessInfoHelper+SystemThreadInformation
000007fee785b0b0 1013 256368 System.Collections.Hashtable+bucket[]
000007fee785d608 5523 309288 System.RuntimeType
000007fee785c5a0 355 371212 System.Char[]
000007fee783f5e0 5105 792776 System.Object[]
000007fee785f490 233 929502 System.Byte[]
000007fee785b318 9773 1157990 System.String
000007fee784d6e8 14 1812040 System.Int64[]
0000000000437260 104 2654270 Free
Total 54509 objects
Fragmented blocks larger than 0.5 MB:
Addr Size Followed by
00000000015f8bc0 1.8MB 00000000017c6f50 System.SByte[]
Also wie man sieht nicht die Bohne von hinweis wo meine 1,6 GB hin sind.. Der dürfte sich eigentlich nur ein paar MB nehmen. Ich vermute das eventuell native Sachen sind die da den Speicher blockieren.. Aber wie bekomme ich so etwas raus?
Speicher ist noch genug da, somit kann ich mir auch vorstellen das der GC mir da ein Schnäppchen spielt.. aber 1,6 GB?? Ich habe mich auch schon mit Just Trace von Telerik an den Process gehängt und einen GC run erzwungen.. -> nichts.
Vllt kann mir jemand einen Hint geben wo ich noch schauen kann.
Grüße
Hi,
für solche Sachen ist PostSharp eine mächtiges Tool. Ich würde es nur deswegen nicht einführen, aber wenn Dir noch mehrere Anwendungsfälle einfallen, ist es eine Überlegung wert.
Gruß
Jan
Hallo,
also ich hatte das damals einmal für Silverlight und .net gemacht.
Ich habe 2 Projecte gemacht. In dem einen habe ich ganz normal meine Klassen erstellt, und in der anderen als Link eingebunden. Und falls dochmal was unterschiedlich war, habe ich mit precompile Anweisungen (#if SILVERLIGHT) gearbeitet. Hat für mich gut funktioniert.
Gruß
Ja, Du hast recht, der Kaffee hat noch nicht gewirkt.
Das kann nicht funktionieren weil ich ja als TypArgument von ControlRenderBase auch alle Ableitungen von LabelControl benutzen kann, was dann aber nicht mehr dem Interface entspräche.
Danke.
Hallo zusammen.
dachte eigentlich ich wäre Fit in Generics..
aber warum funktioniert das nicht :
public interface IControlRenderer
{
LabelControl Control { get; }
}
public abstract class ControlRenderBase<TLabelControl> :DrawingVisual,IControlRenderer where TLabelControl : LabelControl
{
public TLabelControl Control { get; set; }
}
Fehlermeldung:
'DrawingVisualSample.ControlRenderBase<TLabelControl>' does not implement interface member 'DrawingVisualSample.IControlRenderer.Control'. 'DrawingVisualSample.ControlRenderBase<TLabelControl>.Control' cannot implement 'DrawingVisualSample.IControlRenderer.Control' because it does not have the matching return type of 'LabelDesigner.LabelControl'.
Hat es doch! Grml.
und irgendwie unter x64 ausführen
Nicht irgendwie. Einfach so.
Wenn Du Spiel als DataContext nimmst, kannst Du dann mit {Binding Spieler.Liste} auf deine ObservableCollection (wobei Liste ein Proberty ind der Klasse Spieler ist).
Alles was Du bindest muss ein Property sein. In diesem Zusammenhang solltest Du dir auch einmal die impl. von INotifyPropertyChanged angucken.
das Feld Name vom Typ string
Binden kannst Du nur public Propertys
Grüße
Nen verdammt grosser Wald 😃
GetNamedValue gibt dir in diesem Fall ein XmlAttribute zurück. Dieses kann man nicht einfach in ein Int convertieren. Du musst erst den Value aus dem Attribute holen, und den dann in int convertieren.
LG
Hi, hört sich für mich nach nem PropertyGrid an.
Sehr hilfreiche Funktion, Danke.
hallo,
hab das gerade einmal ausprobiert. Mit xsd2code funktioniert das ganze (auch Automatisch)
Bei den beiden Filenames fehlt jeweils das führende ' ausserdem müssen die Namen glaub ich auch in '
WCF ist vllt ein wenig dick für diese simple Sache, aber ich würds glaube ich der einfachheit halber damit machen.
Mit Devart gibt es einen drittAnbieter der Tools und treiber rund um das Thema Oracle/Ef bereitstellt. Allerdings weis ich nicht ob include hier mit ef4.3 zusammenarbeitet, aber ich habe auch noch nichts gegenteiliges gehört.
Ist allerdings kostenpflichtig.
Und wenn nicht kann er das gut mit dem xsd.exe (VS) tool aus dem Xml Generieren 😃
sorry mein fehler hab die Augen noch nicht richtig auf.. (Urlaub 😉 vergiss was ich gesagt habe.. war im falschen Film
Hallo icolor
Soweit ich weis funktionieren Parameter nur bei Werten, nicht bei Tabellennamen.
Ich denke Du wirst mit string.format oder ähnlichen Arbeiten müssen.
Hmm, also nur der Pfad der Assembly ist unbekannt? Was spricht dagegen bei Programmstart mit AssemblyResolve zu Arbeiten?
Dann kannst Du Sie zur Compile Zeit einfach Referenzieren und den Assembly Pfad z.b. in der AppConfig hinterlegen.
Hallo,
das sollte mit einem Reflector funktionieren.. zb.: Der kostenlose von Telerik: Just Decompile
Prüf mal ob user.BaseUser null ist.
WPF oder Silverlight?
Bei Silverlight damals war das schon ein wenig gehakke.. damals keine Ahnung wie das jetzt ist.
Bei WPF im Binding den UpdateSource Trigger auf PropertyChanged stellen.
Zu Frage 2 müsste ich raussuchen, wenn bis Morgen keine Antwort da ist schau ich mal in nem alten Projekt von mir.
Hi, hört sich für mich ersteinmal wie ein Threading Thema an.. aber wie gfoidl schon sagte, näheres kann man erst sagen mit ein wenig code.
Hallo,
Und bei "GetMemberAsnyc" wird halt die "Member" Auflistung gefüllt.
Nur gefüllt oder auch neu erzeugt? Wenn Du auch neu erzeugst würde ich auf ein fehlendes INotifyPropertyChanged tippen, bzw den Aufruf des selbigen.
Was hält Dich davon ab ein Performance Test zu machen?
Besser oder schlechter ist wohl Geschmackssache.. ich finde die untere übersichtlicher, obwohl da ja noch die Convertierung zu base64 fehlt im Vergleich zur oberen.
Was möchtest Du denn einsetzten? Du kannst aus allen .net projecten wcf ansprechen, Du musst nur eine Service Reference erzeugen.
Der Handshake sollte nicht dein Problem sein, weil Protokoll (Binding) abhängig. Hier wohl tcp. Ansonsten ist WCF nur reines XML + vllt ein paar headerdaten (Immer von der Default config ausgegangen).
Hi,
du kannst den den Command als nicht zu serialisieren kennzeichen (je nachdem welchen Serializer Du benutzt sieht das leider anders aus..). Wie Du schon sagtest, kannst Du Dir den Methodenname als string abspeichern, und den Funktionspointer beim deserialisieren oder im beim ersten Aufruf des Commands per Reflection wieder aufbauen.
Das Problem dabei ist, das Du das Feld erst garnicht abfragen darfst.. eine Tatsache die ich selbst schon immer sehr fragwürdig fand. Andererseits gab es damals noch keine Nullable Typen.
Schau mal hier: OracleDataReader.IsDbNull
Du hast einen null Wert in einem deiner Datensätze.
den musst Du explizit vorher abfragen, sonst kommt es zu diesem Fehler.
Du hast vollkommen recht!
dummerweise wird dieser nicht aufgerufen! Ich habe von IValueConverter abgeleitet, und diesen angegeben. Aber scheinbar geniesst DataContext hier Sonderrechte.
Du führst das ganze in einer schleife aus.
Soweit ich weis wird das event ProgressChanged mit dem Gui Thread gesynct und asyncron ausgeführt das braucht Zeit.
Das heisst wenn ProgressChanged wirklich gefeuert wird, ist deine schleife schon im nächsten durchlauf und hat den String schon wieder auf Trying gesetzt (vllt. sogar schon mehrmals).
So etwas nennt sich Race Condition.
Das Update 3 ist raus, verhalten genauso?
Ok,
da es ja scheinbar keinen Vernünftigen ansatz dafür gibt, sollte ich vllt schreiben wie mein derzeitiger Hack aussieht:
Ich erzeuge im Loaded Event des Controls mein ViewModel und impfe den Derzeitigen DataContext (in diesem Moment mein Datenobject) in das ViewModel ein. Danach setze ich den DataContext auf mein ViewModel. Nicht besonders schön, und gibt ne Menge Binding Fehler am Anfang.
Hallo,
ich habe vor diesem Problem schon öfter gestanden, und meist habe ich es dann mit irgendwelchen hacks umschifft.
Ich habe hier ein UserControl das an ein RowDetail einer RadGridView (telerik, aber ich denke das verhalten wird im WPF Grid das selbe sein) gebunden ist, und so Automatisch den DataContext der Row (also mein Datenobject) erbt. Dummerweise schleudert es mir aber damit mein mir erdachtes ViewModel (Das ich im Xaml festlege) in Richtung Garbage Collector.
Ich bräuchte im Prinzip eine schöne möglichkeit in der nicht mein gesamter DC ersetzt wird, sondern mein Datenobject in ein Property des DC geimpft wird. Gibt es da eine möglichkeit?
Hoffe ich habe mich einigermaßen verständlich ausgedrückt.
Grüße
Wenn Du das öfter bei mehreren Kunden machst, und optimaler Weis deinen eigenen Server hast, wären nuget packages vllt was für dich.
Hallo,
string.format und [Hinweis] Wie poste ich richtig? sollten deine Ansätze sein.
Hmm,
also, wenn ich an Regions denke, ist das für mich meist ein Zeichen dafür das Klassen einfach zu groß geworden sind. Deshalb teile ich sie dann, und verwende Regions eigentlich nur dann wenn es tatsächlich nicht anders geht.
Die IMHO mit JS/HTML leichter ist.
Puh wer Javascript WPF vorzieht isst auch kleine Kinder 😉
Hmm,
warum sollte man das tun? Und selbst wenn Du das verhindern könntest, gibt es andere Möglichkeiten das Object zu serialisieren.
Hmm, ist aber eine Studie des amerikanischen Marktes.
Ausserdem haben die ja durchnittlich 12,5 Jahre .Net Entwicklungs Erfahrung.. Sportlich wenn man bedenkt das .net1.0 erst 2002 erschienen ist 😃
Hallo,
dein DataSet benutzt intern ein System.DateTime, was auch immer eine Uhrzeit representiert. Das standard Format für dein System siehst Du wenn Du toString aufrufst. Wenn Du es anders haben möchtest, musst Du es entsprechend Formatieren. Gugst Du hier: Custom Date and Time Format Strings
Vllt hier der Hinweis auf [Hinweis] Wie poste ich richtig?
Hi, ist die dritte Komponente ausführbar?
Ich habe seit Jahren eine ClickOnce mit 7 Projecten (eine exe, 6 dlls) ohne Probleme am laufen. Und da muss man auch nichts einzeln deployen.
So, Du hast wahrscheinlich VS Express?
Schau mal hier: where-is-wcf-data-services-in-visual-studio-express-2012-for-web
und zu deinem Edit: Du hast doch bestimmt schon ein Asp Project was dein Silverlight Project hosted?
Aber wie gesagt da gibt massenhaft Tutorials zu, die dir das bestimmt 3 x besser erklären können als wir hier.
Rechtsklick auf das Project -> Add Service Reference -> Folge dem Wizard
edit: oh ich glaube ich habe das falsch verstanden.. Der Service existiert noch nicht? Dann musst Du in deinem ASP Project einen WCF Service hinzufügen.
ABER: Da gibt es so viele gute Tuts zu, das ich das hier nicht erklären möchte.
Wenn Du die Antwort schon weist, warum fragst Du dann?
Wenn ich jetzt mal meine Glaskugel kontaktiere.. würde ich sagen das das ein Fall für [FAQ] Warum blockiert mein GUI? ist 😉
Ja, ne.
es ist halt kein PNG. Dann hätte ich den Header gesehen. Aber der Header war halt der eines ZLIB Streams, nicht das eines PNG´s
Das PNG normalerweise auch Deflate benutzt werte ich jetzt mal als Zufall.
Hallo, (Vorsicht Lösung)
ich habe es doch noch lösen können.. Warum passiert das eigentlich immer NACHDEM man ein Post im Forum macht? Also zur Lösung:
Base64 war richtig.
LZ77 ist zwar auch richtig, aber es war derivat ein ZLib Stream. sharpziplib kann damit umgehen.
Dann war darin kein PNG enthalten (Warum sollte man auch dem generierenden Tool glauben, das es wirklich reinsteckt, was es sagt das es reinsteckt..). Es war eine Simple BitMatrix.
Mit folgendem Code kann man das Beispiel lösen:
(64 ist übrigens keine Magik Number sondern Bytes per pixelrow)
var bytes = Convert.FromBase64String(testMimeBase64);
using (var stream = new InflaterInputStream(new MemoryStream(bytes)))
{
var bytesResult = stream.ToByteArray();
for (int i = 0; i < bytesResult.Length; i++)
{
bytesResult[i] = (byte) ~bytesResult[i];
}
var bit2 = new Bitmap(64*8, (int)(bytesResult.Length/64), PixelFormat.Format1bppIndexed);
var lockbits = bit2.LockBits(new Rectangle(0, 0, 64*8, (int) (bytesResult.Length/64)), ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed);
System.Runtime.InteropServices.Marshal.Copy(bytesResult,0, lockbits.Scan0, bytesResult.Length);
bit2.UnlockBits(lockbits);
}
Danke trotzdem 😃