Hallo a957m,
oder statt dem HashSet<T>
aus MrSparkles Beispiel allgemein ein IEnumerable<T>
als Argument übergeben.
mfG Gü
Hallo LaTino,
Windows-Authentifizierung mit IIS und Kestrel
Mit IIS und Kestrel nicht, aber mit IIS und der Authentication Middleware.
Ein paar Einstellungen müssen angepasst werden, siehe z.B. How to Support Windows Authentication for ASP.NET Core in IIS
mfG Gü
Hallo,
kennt aber ASP.NET Core IIS nicht, da bei Core KESTREL als Reverse Proxy dazwischen hängt.
der IIS ist der Reverse Proxy und Kestrel der (Web-) Server der mit der ASP.NET Core Anwendung "spricht".
Die Anwendung sollte gar nicht wissen dass vor "ihrem" Server (Kestrel) in Reverse Proxy (IIS od. Nginx, etc.) ist, daher gibt es auch keinen direkten Weg die Bindungen auszulesen, nur über Umwege wie oben in der verlinkten Issue erwähnt.
mfG Gü
Hallo Glowhollow,
Leider verstehe ich nicht so ganz genau was da gemeint ist.
Als Hintergrund: Data structure alignment
Es geht darum wie die Felder des Structs (das Attribut kann übrigens auch für Klassen verwendet werden) im Speicher angeordnet sind und ob es dem Compiler gestattet ist zwischen den Felder Padding einzufügen oder nicht.
Ein Nutzen ist Interop mit nativem Code, bei dem die Feldanordnung fix gegeben ist.
Ein weitere Nutzen ist Optimierung, da so die Felder "aligned" werden können und das bietet u.U. besseren Speicherzugriff und/oder kleinere Structs und somit weniger Speicherverbrauch (der u.U. in weniger Arbeit für den GC resultieren kann, falls das Struct in einem Object (Klasse od. durch Boxing) verwendet wird, da es dann auf dem Heap landet).
Dieser Nutzen ist aber "premature optimization is the root of all evil" und sollte daher nur durch ausreichendes Profiling angewandt werden.
mfG Gü
Hallo pinki,
das ist schön 😃 und genauso sollte open source gelebt werden.
mfG Gü
Hallo,
das ist ein Beispiel bei dem auch mit Span<T>
gearbeitet werden kann.
public static IEnumerable<int> GetWindowedMax(this int[] source, int windowSize)
{
int windows = source.Length / windowSize;
for (int i = 0; i < windows; ++i)
{
Span<int> span = source.AsSpan(i * windowSize, windowSize);
yield return GetMax(span);
}
}
private static int GetMax(Span<int> span)
{
int max = int.MinValue;
for (int i = 0; i < span.Length; ++i)
{
if (span[i] > max) max = span[i];
}
return max;
}
(Code ohne Argument-Validierung und nicht optimiert).
mfG Gü
Hallo pinki,
Die Ausgabe der von Moq geworfenen
MockException
finde ich dennoch nicht so in Ordnung
In diesem Fall könntest (und solltest) du in https://github.com/moq/moq4/issues eine Issue erstellen, damit das u.U. geändert werden kann.
mfG Gü
Hallo pinki,
tja, das ist das Problem mit Gleitkommazahlen 😉
Wenn es um Vergleiche geht und es möglich ist int
zu verwenden, so sollte auch int
verwendet werden, da so die Vergleiche exakt durchführbar sind.
Hier könntest eben Zahlen aus dem Intervall [0, 100] übergeben und gut ist es.
[FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler
mfG Gü
Hallo,
damit Du nicht zu viele Arrays allozierst.
ArrayPool
verwenden. Ob dann auf die Arrays viaSpan<T>
zugegriffen wird ist eine andere Geschichte (aber meist eine vorteilhafte).
mfG Gü
Hallo LaTino,
Git hat den Fokus auf Integration, svn auf Kollaboration
Wirklich? Gerade für Kollobaration -- für mich das Zusammenarbeiten mehrer Entwickler -- sehe git klar im Vorteil und das zeigen auch die Erfolge von git-Plattformen wit GitHub, etc.
Der Grund liegt im verteilten Konzept von git, während SVN auf Zentralisierung setzt.
dass man zufrieden ist und keinen Grund sieht, zu wechseln.
Genaus so war es bei mir auch, bis ich in die git-Ecke gestupst wurde und seitdem sehr froh über diesen Schritt bin.
Wenn jemand nichts Anderes kennt, so ist leicht mit dem was man hat zufrieden zu sein. Reisen bringt neue Erfahrungen und so lässt sich die Zufriedenheit anders bewerten 😉
mfG Gü
Hallo Christoph1972,
vor ein paar Jahren, bevor ich von SVN zu git migrierte, hatte ich ähnliche Gedanken / Sorgen. Nach der Migration zu git bereute ich nur, dass ich nicht schon früher diesen Schritt vollzogen hatte. git ist v.a. wenn mehrere Zweige im Spiel sind SVN weit überlegen.
Neben der CommandLine nutze ich auch TortoiseGit fürs git-GUI (und manchmal auch den in VS integrierten).
Einen lokalen Server brauchst du bei git auch nicht. Ein git init in einem Ordner reicht und schon ist das Repo einsatzbereit.
Für "Server"-Lösungen gibt es genug Anbieter, siehe die anderen Antworten.
SVN war einmal das Non plus ultra, aber diese Zeiten sind vorbei 😉
mfG Gü
Hallo ill_son,
beim Deserializieren eines Objektes den Pfad der Quelldatei als readonly Property mit im Objekt speichern
Was machst du wenn beim Deserialisieren kein FileStream verwendet wird, sondern ein anderer Subtyp von Stream?
Wenn schon, so würde ich das Objekt wie folgt aufbauen:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public class MetaPerson : Person
{
public string XmlFileName { get; }
}
Also mit "Meta"-Klasse, so dass das eigentlich (Daten-) Objekt davon unberührt bleibt.
Gibt es da einen offiziellen Weg? IXmlSerializable implementieren, aber das ist ziemlich aufwändig.
Einen eigenen Xml-Serialisierer durch Erben von XmlSerializer
erstellen und die nötigen Methoden überschreiben. Ist u.U. einfacher als IXmlSerializable
zu implementieren.
Den DataContractSerializer
verwenden und OnDeserialized auf eine Methode der Klasse klatschen. Das hat jedoch den Nachteil, dass du in der Klasse eine Abhängigkeit zum Serialisieren aufbaust -- genauso wie bei der Möglichkeit bei IXmlSerializable
.
Wenn das Objekt stets vom gleichen Typ ist, so wäre auch Linq2Xml eine Möglichkeit, spricht manuelle Deserialisierung.
mfG Gü
Hallo SamsonBB,
fürs Ermitteln der Änderungen suche auch nach "diff". Da gibt es schon eine Menge und so brauchst du nicht bei 0 zu beginnen.
Die Levenshtein-Distanz sehe ich hier nicht unbedingt von Vorteil, eher den "longest common substring", aber wie erwähnt siehe diff.
mfG Gü
Hallo _Cashisclay,
kennst du [Artikelserie] SQL: Parameter von Befehlen ? Damit sollte deine Frage geklärt werden und gleichzeitig guter Programmierstil gelehrt werden.
mfG Gü
Hallo weismat,
sicher?
Nur weil async
dort steht, ist es noch lange nicht asynchron. async
ist für den Compiler nur der Hinweis, dass ein await
in der Methode folgt bzw. folgen kann und er dann diese Methode durch die Async-Statemachine zu ersetzen hat bzw. wenn diese Statemachine nicht selbst im Code angegeben wurde*, so dass er diese eben selbst erstellt.
der Stelle asynchron in einem eigenen Task, den hier die Textbox erstellt hat
Die Textbox hat keinen Task erstellt. Da geschieht alles synchron.
* wie es ja durch das C# 7 Feature mit generalisierten "async return types" ermöglicht wurde.
Hallo sugar76,
Der Aufruf von Task.Run() kostet mehr Ressourcen als ein synchroner Aufruf.
Bei "trivialen" Validierungen würde ich diese einfach synchron durchführen, so lange das in [FAQ] Warum blockiert mein GUI? Erwähnte berücksichtigt bleibt, v.a. dass die Validierung nicht zu lange dauert.
Nur bei längeren Validierungen, wie z.B. jene die gegen eine Datenbank prüfen müssen, würde ich nur einen asynchronen Weg gehen.
Ein "Mischbetrieb" von asynchroner/synchroner Validierung ist m.E. nicht ohne weiteres möglich
Mit einem Producer/Consumer kann das ermöglicht werden. Der Producer (die UI bzw. der Code, der von der UI zur Validierung aufgerufen wird) erstellt eine Validierungs-Aufgabe und steckt diese in die Warteschlange / Queue.
Der Consumer arbeitet asynchron die Validierungs-Aufgaben ab und aktualisiert das UI entsprechend.
Dein oben gezeigter Weg via Task.Run ist im Grunde nichts anderes als der eben beschriebene Producer/Consumer Weg. Nur mit P/C bist du eine Abstraktationstufe höher als bei den Tasks und hast mehr Freiheiten. Möglich wäre z.B. die Validierungs-Aufgaben mit einer Aufwands-Eigenschaft zu versehen und so wenig aufwändige Aufgaben zur Ausführung dem Dispatcher hinzuzufügen, während aufwändigere Aufgaben via ThreadPool ausgeführt werden, etc.
mfG Gü
Hallo baer999,
nein das geht nicht, denn der SQL Server speichert die Dateien in einem für ihn passenden Format mit speziellen Dateinamen ab. Es sind interne Daten vom SQL Server und da sollte nicht herumgepfuscht werden -- genauso wie die eigentlichen Datenbankdateien (mdf) auch nicht bearbeitet werden sollen.
Suchfunktion über alle Dateien hinweg
Entweder selbst implementieren anhand der DB-Tabellen od. auf das Filestream-Feature verzichten und die Dateien direkt im Dateisystem speichern und in der DB nur die nötigen Metadaten.
mfG Gü
Hallo,
das Dashbord von Gitlab ist interessant (siehe auch angehängtes Bild für einen Snapshot). Die Interpretation dessen ist jedem selbst überlassen (Achtung auf US-Datumsformat mit M/D)
Manche Reaktionen sind einfach nur sehr trollartig und oft auch ohne vorher nur die trivialste Eigenrecherche durchzuführen.
Wirklich schlimm finde ich die Einstellungen mancher (zum Glück weniger) der Art "ich bin Open Source Contributor, daher kann und darf ich alles machen". Schade wenn sich scheinbar gescheite Leute auf diese Weise selbst disqualifizieren, denn zumindest an sozialer Intelligenz mangelt es dort gehörig.
@Abt: GitHub-XP ist wirklich cool 😃
mfG Gü
Hallo,
so hat MS keine Urheberrechte an den Repositories o.ä. gekauft.
Urheberrechte sind ohnehin nicht übertragbar -- zumindest bei uns.
Für US müsste wohl auch ein "Copyright transfer agreement" vorhanden sein -- das für jedes Repo bzw. GitHub-Organisation ist wohl auch eher undenkbar.
Desweiteren sind auf GH auch Google, Facebook, etc. vertreten und die könnten einen Prozess gegen MS durchaus aufnehmen und v.a. standhalten, sollte jemals eine der latenten Gefahren, die an die Wand gemalt werden, wahr werden.
Hier sehen wir, so wie es sich liest, keine Gefahr durch MS und betrachten die Situation nicht durch die MS-Basher-Brille.
der behauptet, dass Microsoft seinen Code geklaut hat.
Ich sehe da nicht mehr als ein Bashing gegen Großkonzeren, hier im speziellen MS. Einen Beweis in der ein od. anderen Art liefert er ja selbst nicht, während MS sogar eine forensische Untersuchung vom Code bzw. den Repos durchgeführt hat.
Ich finde es gut, dass MS sogar solchen Behauptungen mit Ernst nachgeht und Lizenzen sehr ernst nimmt.
In corefx hab ich auch schon ein paar mal beobachten wie ein PR abgelehnt wurde, da es lizenzrechtlich nicht passte.
mfG Gü
Hallo inflames2k,
du kannst auch Configuration in ASP.NET Core zusammen mit Options pattern in ASP.NET Core verwenden und dort den Pfad zur Datei selbst angeben.
Einstellungen speichern (serialisieren) sollte kein Problem sein.
mfG Gü
Hallo,
so richtig überrascht bin ich davon nicht, denn so bekommt MS mehr Einfluss in die Entwicklungs von GitHub und so zwischen manchen Zeilen ließ sich herauslesen, dass sie gerne manche Punkte anders hätten.
Für mich als ohnehin MS-affinen Programmierer stellt die Übernahme keine Bedrohung od. Gefährdung dar, wie sie in manchen Posts im WWW momentan zu lesen sind. Ich bin gespannt wie sich das in der Community entwickeln wird.
Interessant finde ich manche Aussagen, dass sie nicht wollen dass ihr Code bei MS lagert denn sie wissen nicht was MS damit macht. Nur gut dass es Open Source ist... 😉 (abgesehen von GitHub-private)
mfG Gü
Hallo filmee24,
will ein Pos programmieren
Was ist ein "Pos"?( (Vllt. hab ich auch nur die Zeit verpasst 😉
mfG Gü
Hallo T-Virus,
ergänzend zu Coffeebeans Antwort: wenn du z.B. ein Projekt hast, das via NuGet allgmeine verfügbar sein soll, so erreichst du mit einem niedrigeren .NET Standard mehr "TargetFrameworks" als mit einem höheren (siehe dazu auch im Link den ".NET implementation support").
Hallo weismat,
Span statt Substring
Span ist eine coole Sache. Bedenke dass eine "fast" und "portable" Variante der Span gibt.
Die schnelle Variante wird direkt durch den JIT unterstützt und ist großteils fast so performant wie (sz-) Arrays. Diese Variante wird aktuell nur von .NET Core 2.1+ unterstützt.
Die portable Variante hat keine direkte JIT-Unterstützung, sondern ist auf zusätzlichen C#-Code angewiesen, daher ist diese ein wenig langsamer als die schnelle Variante.
Vom Funktionsumfang sind beide aber ident.
Wenn ihr das Projekt nur intern verwendet und es möglich ist, so würde ich als TargetFramework direkt auf netcoreapp2.1 gehen.
Noch ein Hinweis: ich weiß nicht ob du string.Create
kennst, aber das finde ich super, da so direkt mit einer Span in den String-Buffer während der Konstruktion des Strings geschrieben werden kann. Das erspart das kopieren vom Quell-Buffer zum String-Speicher.
mfG Gü
Hallo Abt,
den höchsten möglichen .NET Standard
warum den höchsten?
Soll das Projekt möglichst universell einsetzbar sein, so würde ich den möglichst niedrigsten .NET Standard (also z.B. 1.5 statt 2.0) verwenden.
Ist das Projekt ohnehin nur für internen Gebrauch, so den höchsten (aktuell: .NET Standard 2.0) od. wenn es rein auf .NET Core laufen kann, so dann auch dieses, da so u.U. mehr API zur Verfügung stehen.
mfG Gü
Hallo manullino,
WCF hat wohl einen schlecht stand bei Euch! 😉
Nein, bei mir nicht 😉
Aber entsprechend deinen Anforderungen gibt es passendere Möglichkeiten, eben jene die genannt wurden.
mfG Gü
Hallo weismat,
Multi-Targeting ist ein guter Weg um das zu bewerkstelligen. MS macht es bei vielen ihren Projekten auf github auch nicht anders.
nach dotnetcore migrieren?
Sofern möglich .NET STandard verwendne, denn so können die Projekte universeller verwendet werden. Ggf. auch einen Target für .NET Core 2.1 hinzufügen, da es dort coole Span-API gibt 😉
Ein alternativer Weg ist das Projekt basieren auf .NET Standard / .NET Core neu zu beginnen und den Code eher per Copy & Paste zu übertragen und so gleich die Altlasten im Code über Bord werfen. Wie z.B. bei EF und EF Core od. aber auch Asp.net und Asp.net Core.
Es kommt auf den Umfang deiner Projekte an und was das Ziel der Migration ist. Nur Migrieren um des Migrierens-Willen ist zu wenig, da kannst du es lassen...
mfG Gü
Hallo sugar76,
bei await
wird der aktuell vorhanden SynchronizationContext "gefangen" und wenn die asynchrone Operation fertig ist und die "Continuation" (d.h. der Rest der Methode, der nach await folgt) ausgeführt wird, so wird diese mit SynchronizationContext.Post
ausgeführt. Im Falle von WPF heißt das, dass die Continuation im UI-Thread ausgeführt wird. Dabei ist es egal ob die asynchrone Operation in einem anderen Thread ausgeführt od. nicht.
Mit await RefreshAsync.ConfigureAwait(false)
kann das Fangen vom Sync-Context ausgeschalten werden, dann würde in deinem Beispiel der gleiche Fehler kommen, denn die Continuation würde nicht mehr im UI-Thread ausgeführt werden, sondern dort wo der aktuelle TaskScheduler es für richtig hält (also potentiell in einem ThreadPool-Thread). ConfigureAwait(false) macht daher v.a. in Library-Code sinn, denn dort ist das Fangen unnötiger Aufwand. Erst dann wenn es zurück zur UI (od. allgemein einer Thread-affinen Umgebung) geht muss die Ausführung der Continuation zurück in den entsprechendne Context delegiert werden.
async Task Do()
{
await Task.Delay(500);
Console.WriteLine("Hallo");
}
entspricht grob
Task Do()
{
return Task
.Delay(500)
.ContinueWith(_ => Console.WriteLine("Hallo"), TaskScheduler.FromCurrentSynchronizationContext());
}
.
Während
async Task Do()
{
await Task.Delay(500).ConfigureAwait(false);
Console.WriteLine("Hallo");
}
folgendem entspricht:
Task Do()
{
return Task
.Delay(500)
.ContinueWith(_ => Console.WriteLine("Hallo"));
}
BTW:
public async void RefreshAsync() { ItemList.Clear(); IEnumerable<T> items = await Task.Run(() => GetItems()); ItemList.InsertRange(items); }
Anstatt mittels Task.Run
eine synchrone Operation in einem (ThreadPool-) Thread auszuführen, wäre es besser wenn GetItems
zu einer asynchronen Operation gemacht wird. Z.B. hat ADO.net und EF asynchrone Methoden wie ToListAsync
mit denen der DB-Zugriff asynchron erfolgt. Genauso beim Laden via HttpClient usw.
Der Task wird mittels Task.Run(() => ...) in einem separaten Thread ausgeführt.
Mit Task.Run wird dem aktuellen TaskScheduler mitgeteilt, dass der die übergebene Aufgabe (den Delegat) für die Ausführung planen soll. Mehr nicht.
Standardmäßig verwendet der TaskScheduler den ThreadPool, d.h. die Aufgabe wird im ThreadPool ausgeführt werden.
Somit ist deine Aussage für das Standardverhalten passend, nicht jedoch im Allgemeinen 😉
mfG Gü
Hallo manullino,
und wenn du Web-API verwendest auf der Client-Seite dann auch die HttpClientFactory
mfG Gü
Hallo Kriz,
für mich ist mittlerweile als "best practice" die Konfiguration von ASP.NET Core (siehe Abts Beitrag) hervorgegangen und zwar sowohl für .NET Core als auch .NET Full.
Dies v.a. wegen (ohne bestimme Reihenfolge):* es können verschiedene Konfigurationsquellen vereint werden, die sich in der Reihenfolge des Hinzufügens zum Konfigurations-Builder überschreiben -- dadurch können z.B. sensible Daten außerhalt der "Hauptkonfiguration" gespeichert werden und zur Laufzeit werden diese vom Framework zusammengeführt
mfG Gü
Hallo,
mir gefallen diese Filter nicht. So ein Automatismus ergibt eine binäre Entscheidung und das wars. Kommt der Filter zum Ergebnis dass ein Verstoss vorliegt, ohne zu wissen dass ich die Erlaubnis für die Kopie habe, was dann? herbivore hat dazu ja passende Beispiele genannt.
Oder A ist der Urheber. A gibt B eine Kopie, B veröffentlicht diesen. Kann dann A, als Urheber, sein Werk nicht mehr veröffentichen das es der Filter verbietet?
Eine "Moderation" durch Menschen hat den Vorteil, dass diskutiert und eine Lösung gefunden werden kann. Es ist also keine rein binäre Entscheidung.
Es ist auch klar, dass es für das www keine Moderation geben kann, die jeden Upload prüft. Dadurch ergibt sich eine Latenz bis eine Rechtsverletzung korrigert werden kann -- falls überhaupt. Dies finde ich aber besser als eine pauschale Annahme eines Verstossen, die dann durch die Prüfung vom Filter negiert werden kann und der Upload stattfinden kann.
in dem ich einen Uploadfilter für sinnvoll halte, nämlich dann, wenn (vorzugsweise gefakte) Fotos (oder auch Rachepornos), die eine bestimmte Person in rufschädigender oder bloßstellender Weise zeigen, immer und immer wieder neu hochgeladen werden
In solchen Fällten könnte auch die Anzahl der Kopien (sofern sie sich ermitteln lässt, sonst geschätzt) als Multiplikator für das Strafmass dienen. Das schreckt wahrscheinlich mehr ab, als ein Filter der den Upload verbietet und leicht umgangen werden kann.
Wo würde hier die Grenze zwischen sinnvollen Einsatz eines Filter und "no filter" gezogen werden?
Das Urheberrecht sowie auch die Persönlichkeitsrechte sind wichtig und gehörren geschützt. Diese jedoch per Filter zu erzwingen ist der falsche Weg.
Ich kann mir auch kaum vorstellen, dass der Filter Werke berücksichtigt die gemeinfrei werden (Regelschutzfirst endet od. der Urheber gibt es frei).
Leider wird es so sein, dass so ein Filter in der ein od. Form kommen wird. Total Kontrolle über die Bürger scheint wichtiger zu sein als deren Anliegen.
mfG Gü
Hallo Abt,
wie viele Anwendungen auf dem Desktop das eigentlich verpennen.
Stimm dir zu.
Vllt. da Desktop oft isoliert (Intranet od. überhaupt nur lokal) angewandt wird und daher bestimmte Möglichkeiten nicht in Betracht gezogen werden od. möglich sind.
Sonst könnte es ja auch gleich eine Web-Anwendung werden können...
Zugegeben eine sehr vereinfachte Darstellung, aber so ganz falsch finde ich sie nicht.
mfG Gü
Hallo Unfug,
nimm zum Verschlüsseln den CryptoStream
, somit hast du nur Streams und kannst den Input zum Output kopieren (i.e. von Stream zu Stream weiterreichen).
Z.B.
private async Task SendEncrypted(Stream input, Stream output, CancellationToken ct = default)
{
using (var aes = Aes.Create())
using (var transform = aes.CreateEncryptor())
using (var encryptor = new CryptoStream(output, transform, CryptoStreamMode.Write))
{
await input.CopyToAsync(encryptor, ct);
}
}
So kann input
ein FileStream
sein und output
ein NetworkStream
zum Übertragen.
mfG Gü
Hallo Shaarigan,
ModuleHandler ist ein MarshallByRef-Object,
Somit kannst du per Remoting die Fragen 1 und 2 erledigen?
Sonst lädt dir -- wie du ja bemerkt hast -- die Runtime die Assemblies in die Default-Domain. Via Remoting (od. sonst eine IPC für AppDomains) werden die Assemblies dann nicht geladen.
mfG Gü
Hallo BerndFfm,
ich sehe das wie Abt.
Anhand deines Beispiels würde auch im Log stehen dass die Datei nicht gefunden wurde. Zusätzlich sollte der Kontext, aus dem heraus der Fehler entstand, mitgeloggt werden, so dass sich das Problem reproduzieren lässt.
mfG Gü
Hallo HeikoAdams,
unabhängig von Abts Einwand,
Kann ich die auch irgendwie in der Basis-Klasse implementieren oder brauche ich dafür dann etwa ein zusätzliches Interface?
Ja brauchst du. Entweder direkt als Interface od. auch als Basisklasse. Sonst müsstest du ganz nach oben in der Objekthierarchie zu object
, aber dann ist der Vorteil der Typsicherheit weg.
BTW: es sind keine Funktionen, sondern Methoden.
Ein Funktionsaufruf und ein Methodenaufruf sind sich sehr ähnlich, aber vom Konzept her sind das zwei ganz verschieden Dinge. Ein Methodenaufruf ist das Senden einer Nachricht an ein Objekt und die Implementierung einer Methode ist die Vorschrift, wie das Objekt auf eine solche Nachricht zu reagieren hat.
mfG Gü
Hallo,
ich schließe es wegen xaml - WPF Build should fail if StaticResource is missing und [Hinweis] Wie poste ich richtig? Punkt 2.2, das hätte wenigstens als Crosslink angegeben werden können 😦
mfG Gü
Hallo App,
wenn du einen "Basis-Wissensstand" wie z.B. für C# 6 hast, so kannst du dich über Neuerungen wie von Regenwurm vorgeschlagen informieren. Desweiteren ist https://blogs.msdn.microsoft.com/dotnet/ ist ganz interessant und da gibt es oftmals auch Beispiele wie neue Features angewandt werden.
Die Zeit ist hier etwas schnelllebig geworden, daher ist ein Buch -- mit der ganzen Vorlaufzeit die so ein Werk haben muss -- oft schon nicht mehr aktuell sobald es publiziert wird.
Daher empfehle ich div. Blogs (nicht nur die offiziellen .net-Blogs) um sich am laufenden zu halten.
mfG Gü
Hallo Krumnix,
z.B. via Linq und Concat
(sowie ToArray
wenn es wieder ein Array sein soll), also
string[] result = m_ContainerSeparatorOperatorCOMPARE.Concat(m_ContainerSeparatorOperatorCALCULATE ).ToArray();
mfG Gü
Hallo tmase,
Der Service wird in weiterer Folge Anfragen auf meinen Client senden, die dann abgearbeitet werden müssen.
Normal ist es umgekehrt: der Client sendet Anfragen an den Service und der Service arbeitet diese ab.
Wie BhaaL schon schreibt gibt es für "Callbacks" in WCF die duplex Bindungsarten. Das setzt aber voraus, dass Service und Client in .net geschrieben sind und beide die selben WCF-Contracts verwenden.
Ist der 3rd Party Service keine .net Lösung, so könnte vllt. SignalR interessant sein.
mfG Gü
Hallo BlackMatrix,
kennst du das Whitepaper Introduction to TPL Dataflow? Vllt. hilft das fürs Verständnis warum und wieso manche Einstellungen standardmäßig so sind.
mfG Gü
Hallo Abt,
also gut ich fasse zusammen: Wenn du "Nein" sagst, sowie dass es keinen Sinn macht und du nicht weißt wieso, dann gilt automatisch deine Antwort die auch gelesen werden soll. Super! Da ist mir die Zeit zu schade um zu diskutieren.
Nur noch so viel: hast du dir einmal überlegt wo überall ein Producer/Consumer eingesetzt wird und wieviele davon ohne Limitierung auskommen? Vermutlich schon...wozu frag ich überhaupt.
Hallo zusammen,
es gibt etliche Implementierung eines Buffers für ein Producer/Consumer-Szenario die eine Limitierung / Bounded Capacity haben und das aus gutem Grund, denn es mag verschiedene Anwendungsfälle geben, in denen eine maximale Bufferkapazität nicht überschritten werden darf. BlockingCollection<T>
ist so ein Beispiel für einen In-Memory Buffer der in .net dabei ist.
Zitat von: Erzeuger-Verbraucher-Problem
Ist die Aufnahmekapazität der Datenstruktur beschränkt, so soll die Zugriffsregelung ferner verhindern, dass ein erzeugender Prozess auf die Datenstruktur zugreift, wenn die Aufnahmekapazität der Datenstruktur bereits ausgeschöpft ist.
Es gibt aber auch Anwendungsfälle, bei denen ein Producer nicht blockiert werden darf. Auch hierfür gibt es gute Gründe, wie z.B. dass periodische Abtastwerte nicht "verschluckt" werden dürfen.
Für diese Fälle hat Abt passende Möglichkeiten genannt.
Hallo BlackMatrix,
ich konnte bei Stackoverflow leider noch keine passende Antwort
Kannst du dann wenigstens die andere Frage verlinken?
mfG Gü
Hallo Papst,
X509Certificate2 cert = new X509Certificate2(certBytes, string.Empty, X509KeyStorageFlags.MachineKeySet|X509KeyStorageFlags.Exportable|X509KeyStorageFlags.UserKeySet);
Lass einmal das UserKeySet
weg.
In einer geteilten Umgebung wie Azure könnte das womöglich der Grund fürs Scheitern sein, da es kein "richtiges" User-Profil gibt.
Probiere
X509Certificate2 cert = new X509Certificate2(certBytes, string.Empty, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
Kennst du Using Certificates in Azure Websites Applications? (über die Aktualität kann ich leider nichts sagen).
Sollte nichts helfen, so kannst du das Zertificat auch als Ressource (resx) zur Assembly einbinden.
mfG Gü
Hallo Abt,
warum soll die Anwendung hart abbrechen müssen?
Der Producer ist einfach blockiert*, bis der Buffer wieder Platz hat. Standard Producer/Consumer-Szenario.
Ist es deiner Meinung nach besser wenn der Buffer "übergeht" und es so zu einer OutOfMemoryException kommt? Das kann doch keine Logik sein.
Der Buffer ist doch genau dazu da, dass Messages auflaufen dürfen,
Genau, aber nicht bis zum App-Crash, sondern nur bis zu einem bestimmten Limit.
So etwas macht absolut Sinn in meinen Augen.
* bzw. durch die TryXxx-Methoden ist sogar keine Thread-Blockade durch eine Synchronisationsprimitive nötig, sondern es kann eine alternative Ausführungspfad gewählt werden.
mfG Gü
Hallo,
ich sehe das so wie Sir Rufo. Der Buffer kann / muss eine Limitierung haben und wenn diese erreicht ist, so werden die Producer-Tasks blockiert. Mit der BlockingCollection<T> aus der TPL ist genau so und nur so kann sicher ein "Überlauf" verhindert werden.
Das hat auch nichts mit einer Limitierung von In-Memory zu tun od. sonst etwas.
Ließe sich durch eine andere Architekture diese Limitierung vermeiden, so wäre das besser und die Anwendung skaliert auch besser. Aber auch in solch einer Architektur sollte zur Sicherheit eine Buffer-Limitierung vorhanden sein.
mfG Gü
Hallo Palin,
wenn wir von der .net-Variante sprechen, so ist Random eine Klasse und keine function. Und von dieser Klasse kann abgeleitet werden, daher wäre hier eine Bezeichnung ala "PseudoRandom" hinderlich, wenn z.B. eine True-Random Implementierung abgeleitet wird.
mfG Gü
Hallo Caveman,
ItemsSource an eine ObservableCollection gebunden. Die Daten werden angezeigt und ich kann mit Klicken auf die Spaltenköpfe die Daten auch sortieren.
WPF verwendet dann intern eine ICollectionViewSource
für das Sortieren, Filtern, etc.
Das ist aber eine "View" auf die Daten, welche selbst nicht verändert werden, und dadurch z.B. möglich wird, dass zwei od. mehr verschieden solcher Views auf die gleiche Datenbasis angewandt werden.
wie ich die sortierte Reihenfolge wieder in die ObservableCollection bekomme
Entweder du sortierst selbst die Datenbasis od. du verwendest ICollectionViewSource explizit und hast dann Zugriff auf dessen Daten.
mfG Gü
Hallo Papst,
habe mir die genaue Exception dummerweise auch nicht notiert und kann sie erst morgen wieder reproduzieren
Bitte poste dann die genaue Exception (komplett), denn sonst ist Ursachenforschung schwer durchführbar. Wobei FileNotFound wohl auf einen falschen Pfad hinweist unter der Annahme dass die Zertifikats-Date vorhanden ist. Gib daher durch Logging auch den Pfad aus.
Ich hoffe du kopierst ab nun die Exceptions immer und verwirfst sie erst dann wenn du sicher bist, dass sie nicht mehr benötigt wird 😉
mfG Gü
Hallo Palin,
ja interessant, aber so hab ich das historisch auch erwartet (ich kannte die Hintergründe und Motivation dazu vorher nicht).
In .net würde ich System.Random
auch nicht anders implementieren. * Pseudo-Zufallszahlen reichen für viele Anwendungen
In der Doku zu System.Random
steht auch
Zitat von: Random Class
Represents a pseudo-random number generator
mit Verweis auf kryptografische Zufallsgeneratoren. Es sollte somit keiner in diese "Falle" tappen, der die Doku gelesen hat.
mfG Gü
Hallo Davaaron,
Echtzeit Syntax-Fehler anzeigen
Geht grundsätzlich über eine "Live-Compilierung", wobei die lexikalische Analyse dazu reichen sollte. D.h. bei der Eingabe im Editor wird gleich der Code geparst (in einen Syntaxbaum) und analysiert.
Um dies allerdings "flüssig" zu bewerkstelligen ist schon einiges an Programmierkunst nötig.
VS hatte früher seinen eigenen "Compiler" zur Syntaxanalyse und für Intellisense dabei. Neben dem C#-Compiler (csc.exe) gab es somit eine zweite Compiler-Plattform und da dies nicht sehr zielführend und effektiv (aus Entwicklungssicht) ist, war dies auch eine der Motivationen für Roslyn, dem C#-Compiler als Service.
Nun verwendet VS statt dem eigenen Compiler Roslyn um so Doppelgleisigkeiten zu vermeiden -- ein großer Vorteil, v.a. wenn sich die Sprache recht schnell weiterentwickelt.
Zusätzlich gibt es in VS seitdem auch die (mächtige) Möglichkeit von Analyzern um "live code refactoring" zu ermöglichen.
Wenn du das selbst entwickeln willst, so schau dir neben Abts Tipps auch Roslyn an und integriere das in dein System.
Willst du aber nur ganz simples Intellisense, so reicht ein Dictionary-Lookup bei Eingabe eines .
😉
mfG Gü