Funktioniert, soweit ich über SQL CE Bescheid weiß, auch nur, wenn du es schaffst die Datenbank als reine Daten-Halle zu verwenden. Sobald du irgendwo Logik in die DB auslagerst (Prozeduren, Views) etc. geht das nicht mehr.
CE zu verwenden funktioniert meines Erachtens nur sehr bedingt für eher kleine Projekte.
Ich sag mal da musst du etwas mehr investieren. du kannst aus den Daten 1,3,3,3,5,5 nicht die Zeilen 1,2,3,4,5 erzeugen. Dazu müsstest du dir erst eine (temporäre?) Tabelle mit der richtigen Schrittweite erzeugen und dann deine Daten per LEFT JOIN anhängen.
Ich versteh noch nicht ganz das Problem. Meinst du die Sprünge in der ersten Spalte also z.B. 40.0, 40.1, 40.7? Diese Sprünge hast du in der anderen Tabelle auch, das liegt aber wohl einfach daran, dass du im Bereich 40.2 bis 40.6 keine Daten hast.
Schon mal überprüft?
Edit: ich bin mir auch nicht ganz sicher, ob dein Statement überhaupt einen Sinn hat. Im Endeffekt lieferst du nur die Anzahl jeder Ausprägung von IOut, wobei die Ausprägung die erste Spalte darstellt und die 2. spalte nur die erste spalte + 0.2 ist. Im Grunde kannst du eigentlich auch die ganze Rumrechnerei weglassen, weil du ja sowieso nur IOut und IOut + 0.2, und die dazugehörige Anzahl lieferst.
private ICalcService Service
{
get
{
if (_channel == null)
{
var serviceFactory = new ChannelFactory<ICalcService>(
new NetTcpBinding(), "net.tcp://localhost:54000");
_channel = serviceFactory.CreateChannel();
}
return _channel;
}
}
private void Good_Click(object sender, RoutedEventArgs e)
{
try
{
ICalcService service = this.Service;
int result = service.CalcHalf(16);
txtResult.Text += "Result: " + result;
}
catch (Exception ex)
{
txtResult.Text += ex.ToString();
}
}
private void Bad_Click(object sender, RoutedEventArgs e)
{
try
{
ICalcService service = this.Service;
dynamic dynArgs = new DynamicDictionary();
dynArgs.ID = 16;
txtResult.Text += "Parameter: " + dynArgs.ID;
int result = service.CalcHalf(dynArgs.ID);
txtResult.Text += "Result: " + result;
}
catch (Exception ex)
{
txtResult.Text += ex.ToString();
}
}
Programmablauf: Eine WPF-Applikation hostet ein Service in einem eigenen Thread. Das Service (ICalcService) hat 2 Methoden: CalcHalf(int) und Negative(bool). Das MainWindow hat 2 Buttons "Good" und "Bad". In den _Click-Methoden der Buttons wird ein Channel zum Service instanziert und dann die Methode CalcHalf aufgerufen. Die ganze Solution gibts hier zum downloaden: ProxyProblem.zip
Wenn man das auf einer 64bit Maschine (Win7) im VS2010 startet, funktionieren beiden Buttons ohne Probleme. Im TaskManager aber erkennt man, dass die App eigentlich als 32bit App gestartet wird. Startet man diese nun direkt (aus bin\Debug) sodass sie als 64bit-App läuft, funktioniert der Good-Button noch, beim Bad-Button aber friert die Applikation ein. CPU läuft hoch und Speicher wird ohne Ende verbraucht.
Ich habe dann festgestellt, dass der Aufruf CalcHalf mit dem Wert aus dem dynamischen Objekt nicht funktioniert (siehe Unterschied Good und Bad). Da hab ich mir also gedacht, das dynamic-Object kann für TryGetMember die Member-Infos nicht auflösen, da diese von einem TransparentProxy (WCFService) kommen. Ich hab also den Aufruf auf: service.CalcHalf((int)dynArgs.ID); geändert. App als 64 bit starten: Funktioniert!
Ich hab da aber auch noch eine zweite Methode Negative(bool) die im 64bit Modus natürlich prima funktioniert wenn man Negative(true) oder Negative(false) oder Negative((bool)dynArgs.SomeBoolValue) aufruft.
Ich habe aber auch probiert Negative(dynArgs.ID == 16) aufzurufen, weil ich mir dachte, eigentlich sollte klar sein, dass da ein Bool kommen muss, hab aber übersehen, dass das Bool ja erst das Result ist, das dynamicObject also wieder nicht wirklich herausbekommen kann was es für einen Typ liefern soll (oder sollte es beim Vergleich mit 16 wissen, dass ein int gefordert ist?).
Dann habe ich folgenen CodeBlock eingebaut:
public bool MethodUsingBool(bool value)
{
return value;
}
...
var boolValue = MethodUsingBool(dynArgs.ID == 16);
bool result = service.Negative(boolValue);
Der Wert aus dem dynamicObject wird also schon ermittelt, bevor die Methode des Services aufgerufen wird, allerdings funktioniert der Aufruf immer noch nicht. Das Programm friert beim Aufruf der ServiceMethode wie vorher ein.
Ich hab dann mal
var boolValue = true;
bool result = service.Negative(boolValue);
probiert und das hat funktioniert.
Ich bin jetzt an einem Punkt angelangt, wo ich nicht mehr weiß, warum manches funktioniert und manches nicht. Zumal alles einwandfrei funktioniert, wenn man es als 32bit App ausführt.
Das ist ein Crosspost aus der MSDN, da aber keine Antworten gekommen sind, poste ich es hier auch nochmal in der Hoffnung hier hilfe zu bekommen: MSDN Eintrag
Zum Aufbau:
Ich würde das Einfach mit einer Reihe von Stackpaneln (Orientation Horizontal) aufbauen in einem Stackpanel (Vertical). Jedes inner Stackpanel stellt eine "Spalte" (X) dar. In das Stackpanel kommen nacheinander Border mit der definierten Farbe und Größe (Y).
Ja, aber der Returnwert erwartet mindestens wieder ein T und nicht Control. Daher musst du die Variable "control" - wovon du ja sicher sagen kannst, dass es ein T ist (weils du's ja auch so erstellst), auch wieder auf T zurückcasten.
Fraglich ist für mich, warum du das Control dass du als T erstellst auf ein Control zurückcastest ... wird wohl dann im weiteren Code liegen.
EDIT:
Da du die Variable control als "Control" erstellst, könnte diese Variable auch vom Typ "X : Control" sein. Eine Variable vom typ "X" kannst du aber nicht zurückgeben, weil ja "T" erwartet wird.
Wenn du dir also beim return sicher sein kannst, dass die Variable nur vom Typ T sein kann, kannst du das auch casten. Wenn sie es nicht ist, sondern z.B. X, kriegst du dann sowieso an der Stelle eine InvalidCastException (zur Laufzeit).
Eventuell könntest du die Funktion ändern, sodass der Returnwert nur "Control" wäre.
private void btnGetMemoryUsage_Click(object sender, RoutedEventArgs e)
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.GC.Collect();
using (Process process = Process.GetCurrentProcess())
{
double value = process.WorkingSet64 / 1024.0 / 1024.0;
lblMemoryUsage.Text = value.ToString("#.000 MB");
}
}
Wenn ich ein paar mal auf den Button klicke, merke ich einen Anstieg des Speicherverbrauchs, obwohl das Programm ja augenscheinlich nicht mehr verbraucht ... Irgendann machts dann einen Sprung und der Verbraucht geht wieder runter, aber nicht mehr zu dem Wert ganz zu Beginn ...
und auch wenn ich den GC etwas Feuer mache, es werden nur die Sprünge etwas kleiner.
Wenn ich eine Anwendung mit dem oben gezeigten Quellcode im Release erstelle und dann die .exe starte, verbraucht die etwa 33MB (ich mein allein das ist schon ein Wahnsinn). Wenn ich dann eine Minute, alle 20 sekunden auf den Button drücke, ohne die Maus zu bewegen, dann hab ich nach etwa 4 mal klicken 1 MB mehr verbraucht. Für was?
Wenn ich blöd mit der Maus im Fenster herumfuchtle ist auch gleich fast ein MB ...
Welche internen Sachen verbraucht da die WPF und was kann ich alles abdrehen um den Speicherverbrauch zu optimieren?
Man kann noch nicht mal ganz einfach deutsche und österreichische Jobs bzw. primär die Gehälter vergleichen. Andere Abgaben, andere Steuern, 13. und 14. Monatsgehalt etc.
PS dazu:
Wenn das eine von dir erstellte Datenbank/Tabelle ist, würde ich die Spalte gleich mal umbenennen. Das wird dir sonst in Zukunft auch noch irgendwo Probleme bereiten.
das ist für mich keine Lösung. Du gehst zusehr von Beispiel aus. Im realen Programm sind die verhältnisse etwas anders, das minheight ist dann 150 etc.
Die Aufgabenstellung lautet also:
Wie kann ich in einem festen Rahmen, 2 weitere Rahmen im Verhältnis 3:7 anzeigen, wobei der kleinere nicht kleiner werden darf als x. Wenn die Inhalt der beiden Rahmen sich nicht ausgehen, müssen Scrollbalken angezeigt werden.
Im Moment find ich dazu keine Lösung, außer das Verhältnis manuell zu rechnen.
private GridLength? original;
public TestWindow()
{
InitializeComponent();
((FrameworkElement)grd.Parent).SizeChanged += new SizeChangedEventHandler(TestWindow_SizeChanged);
}
private void TestWindow_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (original == null)
{
original = row2.Height;
}
if (row1.ActualHeight > row1.MinHeight)
{
row2.Height = original.Value;
}
else
{
row2.Height = new GridLength(((FrameworkElement)sender).ActualHeight - row1.ActualHeight);
}
}
Funktioniert, springt aber irgendwie ... irgendwelche besseren, evtl. direkt im XAML lösbaren Vorschläge? Hab diese Konstellation sicher 20 mal und will das nicht in jeder Maske so einfügen ...
ja, klar ist das Fenster zu klein, deswegen auch ScrollViewer. Zum Vergleich unten mal das Fenster, wenn man die MinHeight wegnimmt. Da weiß der 2. Scrollbalken auch, dass beim Fensterende Schluss ist ...
Der unterere Scrollviewer wird nicht mehr ganz angezeigt. Ist das ein Bug oder kann ich das irgendwie anderes gestalten, sodass ich in beiden Bereichen bis zum Ende scrollen kann und oben trotzdem die Mindesthöhe habe?
Wenn man nämlich die MinHeight rausnimmt gehts ...
Hab mal statt localhost die 127.0.0.1 oder die lokale IPv4 Adresse verwendet - da geht's bei mir. Es scheint, als würde rawcap nicht über IPv6 funktionieren.
Das hat bei mir nun etwas gebracht, jetzt seh ich wirklich nur mehr "meinen" traffic.
vergleiche,
stelle ich fest, dass ich im "none" output meine "Daten" (hab da jetzt noch einen String mit allen Buchstaben groß/klein und allen Zahlen eingebaut) lesen kann. D.h. ich sehe "ABC...abc..7890" im output dieses trace. Ok.
Zwischen den beiden anderen traces kann ich jedoch nicht viel Unterschied feststellen. Soweit ich verstanden habe müsste ich doch dem "EncryptAndSign" irgendwo auch ein Zertifikat angeben? Ignoriert die WCF das dann einfach wenn sie nichts findet?
Wie gut "verschlüsselt" ist der Transport wenn ich nur Variante 2 nehme?
am XP Rechner mit einem User mit Admin-Rechten hab ich keine Chance, kommt immer der Fehler.
aufm Win7 Rechner mit Admin-User kann ich auf einer Ethernet Schnittstelle und dem Loopback Pseudo Interface sniffen. Allerdings kommt bei der Ethernet-Schnittstelle nur Sachen durch, die mich nicht interessieren und beim Loopback gar nichts.
Meinen Traffic seh ich also immer noch nicht ...
Sorry, ich schaffs einfach nicht. Ich bekomm weder im NetworkMonitor noch im Wireshark irgendwelche Packete angezeigt, wenn ich Daten von meinem WCF-ServiceHost hole.
Und im normale Message-Loging seh ich absolut keine Nachrichten und ich hab extra eine "LargeData" Property in meinen DataContract eingefügt, in dem ich relativ lange Strings erzeuge.
Mach ich da irgendwelche Einstellungsfehler in den Programmen?