Laden...

Forenbeiträge von DNS46 Ingesamt 21 Beiträge

14.07.2022 - 16:20 Uhr

Ja jetzt ist es so wie ich es mir vorgstellt hatte. Glaub meine größte Frage ist von je her wie ihr es immer schafft so schnell zu Antworten

 IP: 13.107.219.45       => time: 22ms   (url: mycsharp.de) 

ist echt quick 🙂
Ping.Send hatte ich nur als Bsp. gewählt um ein paar Milliseconds verstreichen zu lassen. Da die für await gar nicht verwendbar ist bedeutet das ja, dass gar nicht jede Methode asynchron ausgeführt werden kann 😐... nur wenn die über die GetAwaiter Extension verfügt. Damit kenn ich mich noch nicht aus
Danke für die Tipps .... seid die Besten 🙂

14.07.2022 - 14:35 Uhr

Huhu,

kann mir hier jemand nen Hinweis geben? Ich möchte in dem Mini Beispiel parallele Pings starten, warten bis alle ihr Ergebnis geliefert haben und diese anschließend gesammelt ausprinten.
Jetzt fällt aber auf, dass die Aufrufe von Call(..) gar nicht parallel ausgeführt werden, sondern aufeinander warten. Was hab ich denn nicht beachtet?
Ja und dann kau ich gerade am Schlüsselwort await. Erfüllt WaitAll() hier genau den gleichen Zweck?


static void Main(string[] args)
{
   List<Task<string>> myTasks = new List<Task<string>>();
   foreach (string url in new string[] { "mycsharp.de", "www.google.de", "www.wolframalpha.com" })
   {
       myTasks.Add(Task.Run(() => Call(url)));
   }
   Task.WaitAll(myTasks.ToArray());
   foreach (Task<string> task in myTasks)
   {
       Console.WriteLine(task.Result);
   }
}

static async Task<string> Call(string url)
{          
   Ping ping = new Ping();
   PingReply reply = ping.Send(url, 1000);
   return String.Format("IP: {0}\t=> time: {1}ms\t(url: {2})", reply.Address,reply.RoundtripTime, url);
}

// result:
// IP: 13.107.219.45       => time: 22ms   (url: mycsharp.de)
// IP: 216.239.38.120      => time: 23ms   (url: www.google.de)
// IP: 140.177.50.10       => time: 124ms  (url: www.wolframalpha.com)

Danke euch 🙂

23.05.2022 - 15:55 Uhr

Die OutOfMemoryException kam bei > 1 Mio Test Records 🙂 Bis dahin ist aber gut Luft und ich kann noch optimieren
Aufgabenstellungen sind im Dateil halt gar nicht so leicht zu beschreiben (erst recht nicht, wenn sie dazu noch fragwürdig sind)
Per BULK funktioniert leider nicht. Eure Tipps waren aber echt gut

23.05.2022 - 14:30 Uhr

Im Internet habe ich dazu auch Multi-key Generic Dictionary gefunden.

Geil 👍 Genau das brauche ich


MultiKeyDictionary<string, string, string> dictionary = new MultiKeyDictionary<string, string, string>();
                                    
dictionary.Add("99112", "Schlossalle", "address of sombody in 99112 Schlossalle"); //primary key, subkey, value
dictionary.Add("99113", "Poststraße", "address of sombody in 99113 Poststraße");
dictionary.Add("99114", "Wasserwerk", "address of sombody in 99114 Wasserwerk");
            
string zipCode = "99112";
string street = "Schlossalle";
string returnvalue;          

dictionary.TryGetValue_PrimarykeySearch(zipCode, out returnvalue);
Console.WriteLine(String.Format("value for zip code search [{0}] = " + returnvalue, zipCode));

dictionary.TryGetValue_Subkey_Search(street, out returnvalue);
Console.WriteLine(String.Format("value for street search [{0}] = " + returnvalue, street));

// result:
// value for zip code search [99112] = address of sombody in 99112 Schlossalle
// value for street search [Schlossalle] = address of sombody in 99112 Schlossalle


Ich probier mal wie schnell das läuft.
Ja und zu den Datenmengen und so ... das werden am Ende einige 100.000 Records denke ich. Es ist ein ETL Prozess der von einer Applikation liest, transformiert und in ein Ziel DB Schema updatet. Die API Belastung der Quell-App soll möglichst gering gehalten werden. Der Prozess teilt sich das Ziel DB Schema mit anderen Prozessen die genauso Updaten wollen. Sobald der Prozess gestartet wird setzt er deshalb nen DB LOCK auf die Tabellen. Um die LOCK Zeit möglichst kurz zu halten, sollten die Transformationen zügig laufen. Rechenintensiv dürfen sie aber sein.

Dankeschön

23.05.2022 - 01:16 Uhr

Wow - Gute Ideen. Ich danke euch allen.
Den Ansatz mit der doppelten Datenhaltung in 2 Dictionaries find ich jetzt gar nicht übel.
LINQ kannte ich auch noch nicht. Das würde den Code echt schlank halten. Ich mach mal ein paar Performance Tests damit.

20.05.2022 - 18:37 Uhr

Ok Danke - dachte ich mir, war mit aber nicht sicher.
Dictionary lässt sich ja optimiert nach Keys durchsuchen. Bietet .Net auch einen Datentyp der das optimierte durchsuchen von mehreren Attributen ermöglicht ... analog zu indizierten Datenbankspalten?

so ...


System.Collections.Generic.List<Address> myAddresses;
Item address = myAddresses.Find(x => x.Street == "Schlossallee");
Item address = myAddresses.Find(x => x.ZipCode == 12345);

so etwas bräuchte ich, finde es nur nicht.

20.05.2022 - 17:58 Uhr

Ja den Typ hab ich jetzt unterschlagen ...
Ich meine natürlich:


System.Collections.Generic.List<Address> myAddresses;
Item address = myAddresses.Find(x => x.Street == "Schlossallee");

Ich kann anhand der Methodenbescheibung nur mutmaßen, dass hier step by step durchlaufen wird. Ist das korrekt?


        //
        // Zusammenfassung:
        //     Sucht nach einem Element, das die durch das angegebene Prädikat definierten Bedingungen
        //     erfüllt, und gibt das erste Vorkommen im gesamten System.Collections.Generic.List`1
        //     zurück.
        //

20.05.2022 - 16:59 Uhr

Hallo,

ich möchte eine Liste von Objekten durchsuchen.


Item address = myAddresses.find(x => x.Street == "Schlossallee");

würde sich z.B. anbieten. Nun die Frage: Durchsucht diese Methode logarithmisch bzw. anderweitig optimiert oder einfach step by step?
Gibt es Möglichkeiten das nachzuvollziehen?

Falls .find() jetzt keine Optimierung enthält: hat jemand eine Empfehlung in welchen Datentyp Objekte gut verwaltet werden können, wenn diese nach mehreren Attributen suchoptimiert sein sollen. Also so das die myAddresses z.B. einmal suchoptimiert für zipcode und ein andermal für street -Abfragen durchlaufen werden kann?

Wär cool wenn ihr ne Idee habt 🙂
Danke schonmal

25.10.2021 - 10:44 Uhr

Liest sich nach einer unsauber gepflegten Adressenliste, welche optimiert werden soll. Du kannst die Zeile beim zeilenweisen Lesen zunächst an eine temporäre Variable anhängen (StringBuilder würde sich gut eignen). Wenn die nächste Zeile nun mit einem definierten Keyword beginnt schreibst du die temporäre Variable in deine optimierte Liste und setzt die Variable zurück.
… und nach Beendigung der Schleife halt noch einmal extra den Inhalt der temporären Variable schreiben. Das wär‘s schon.

05.10.2021 - 19:26 Uhr

dämmert mir nun auch langsam 😐
Dann bin ich jetzt doch soweit mich euren alternativen Vorschlägen anzunehmen 🙂

05.10.2021 - 16:49 Uhr

akt. schaut die methode so aus:


public static List<T> genericReader<T>(DBConnection dbconnection, string query, int attributes)
        {          
            List<T> resultset = new List<T>();           
            Type type = typeof(T);
            object[]  arguments = new object[attributes];           
            
            MySqlConnection connection = dbconnection.getConnection();
            if (!dbconnection.openConnection())
            {
                log.Error("not able to connect to database");
                return default(List<T>);
            }
            MySqlCommand command = new MySqlCommand(query, connection);
            MySqlDataReader reader = null;
            try
            {
                reader = command.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        if (reader.FieldCount == attributes)
                        {
                            for (int i = 0; i < reader.FieldCount; i++)
                            {
                                if (!reader.IsDBNull(i))
                                {
                                    arguments[i] = reader.GetString(i);
                                }
                                else
                                {
                                    arguments[i] = string.Empty;
                                }
                            }
                        }
                        else
                        {
                            return default(List<T>);
                        }
                        T obj = (T)Activator.CreateInstance(type, arguments);//destination class can not have a list type in its constructor 
                        resultset.Add(obj);
                    }
                }
            }
            catch (Exception e)
            {
                resultset = default(List<T>);
                log.Error(e);
            }
            finally
            {
                connection.Close();
                reader.Close();
            }
            return resultset;
        }

Im Falle von mehreren Konstruktoren gäbe es in der Tat ein Problem 🙁
Besonders wenn 2 noch die gleiche Anzahl an Paramenten hätten.
Type.GetConstructors scheint mir aber gar keine Hilfe da hier keinerlei Info über die Parameter des Konstruktors zurückgegeben werden. Bietet Activator.CreateInstance denn eine Möglichkeit einen bestimmten Konstruktor der Klasse aufzurufen? Bisher hatte ich im Test nur einen Konstruktor verwendet.

04.10.2021 - 14:40 Uhr

Ja ganz ideal ist es so nicht. Da eigentlich nur die Anzahl der abzufragenden Attribute der SQL Query mit der Anzahl der Argumente des aufzurufenden Konstruktors übereinstimmen müssen, bin ich dazu umgeschwenkt diese Anzahl noch mit an die Methode zu übergeben. Das erspart die ständige Erweiterung der generischen Methode selbst. Danke für eure Tipps – hat mir echt super weitergeholfen 🙂 Aktuell denke ich mit Reflections gut leben zu können … schaut ja recht übersichtlich aus.

30.09.2021 - 11:51 Uhr

Cool danke. Die API erschlägt oft ein wenig 🙂
Das wäre damit eine mögliche Implementierung.


Person person = createGeneric<Person>(typeof(Person));


public T createGeneric<T>(Type type) {                    
   object[] parameter = null;
   switch (type.Name) {
      case "Person":                    
         parameter = new object[] { "Anna", "20" };                   
         break;
   }
   if (null != parameter) {
      return (T)Activator.CreateInstance(type, parameter);
   }
   return default(T);
}

Nebensächlich aber eine Sache würde mich noch interessieren. Das Attribut Name in ConstructorInfo[] enthält nicht den echten Namen der Klasse sondern ".ctor" das fiel mir in diversen FileLogger-Ausgaben anderer Applikationen auch schon auf. Weiß jemand warum das so ist?

29.09.2021 - 18:14 Uhr

Danke Palladin007

mit Reflections komm ich an fast alle Methoden der Klasse. Damit könnte via Iteration über die Klassentypen das richtige Objekt mit korrekter Parametrisierung bestimmt werden ... jedoch liefert classtype.GetMethods() ausgerechnet den Konstruktor nicht ... das bekomm ich aber bestimmt noch raus 🙂


Type classtype = typeof(TType);
System.Reflection.MethodInfo[] methods = classtype.GetMethods();
foreach (System.Reflection.MethodInfo method in methods) {    
if("Person" == method.Name) {  
    ...
}

28.09.2021 - 10:40 Uhr

Hallo zusammen, mich würde interessieren ob es eine Möglichkeit/ BestPraxis gibt, mit der man Attribute/Methoden eines generischen Objektes zugreifbar machen kann.

Hier ein Beispiel:
Mittels SQL Result soll eine Liste mit PersonenInfos befüllt werden ... hier zunächst typisiert:


static bool reader(MySqlConnection connection, string query, out List<Person> resultset) {
   bool returnvalue = false;
   resultset = new List<Person>();

   MySqlCommand command = new MySqlCommand(query, connection);
   MySqlDataReader reader = null;
   try {
      reader = command.ExecuteReader();
      if (reader.HasRows) {
         while (reader.Read()) {
            resultset.Add(new Person(reader.GetString(0), reader.GetString(1), reader.GetString(2)));
         }
      }
      returnvalue = true;
   }
   catch (Exception e) { log.Error(e); }
   finally {
      connection.Close();
      reader.Close();
   }
   return returnvalue;
}

So - das geht ... Aber geht das anstatt mit dem Personen Objekt auch wie folgt? ...


static bool reader<TType>(MySqlConnection connection, string query, out List<TType> resultset) {
   bool returnvalue = false;
   resultset = new List<TType>();

   MySqlCommand command = new MySqlCommand(query, connection);
   MySqlDataReader reader = null;
   try {
      reader = command.ExecuteReader();
      if (reader.HasRows) {
         while (reader.Read()) {
            //an der Stelle wird's für mich unlogisch ... der generische Typ kann den Konstruktor von Person ja nicht kennen. 
            resultset.Add(new TType(reader.GetString(0), reader.GetString(1), reader.GetString(2)));
         }
      }
      returnvalue = true;
   }
   catch (Exception e) { log.Error(e); }
   finally {
      connection.Close();
      reader.Close();
   }
   return returnvalue;
}

Weiß jemand ob sich das lösen lässt .... und ob man dabei noch Sicherheit um die Position/Anzahl der Methoden-Argumente hinbekommt?

Danke für Denkanstöße 🙂

05.05.2021 - 16:31 Uhr

wow ihr seid fix. Sagt mir gerade alles noch nix. Danke - jetzt hab ich zumindest einen Ansatz 🙂

05.05.2021 - 16:13 Uhr

Hallo zusammen,

ich habe auf nem Android Gerät was Interessantes gesehen und würde gern wissen ob sich das auf einem Windows System auch implementieren lässt.
Es handelt sich um eine App die den Screen als Videostream aufnimmt und am Ende speichert. Dazu wird dem Anwender nach Aktivierung der App permanent, also egal welche Anwendung akt. den Fokus hat, eine kleine, unscheinbare Schaltfläche am Bildrand angezeigt. Mit der Schaltfläche kann die Aufnahmefunktion zu jederzeit gestartet werden.

Und jetzt die Frage: Bietet C# auch eine Möglichkeit für so eine Schaltfläche? Ich fände die Idee saugeil die Oberfläche auf die Art erweitern zu können. Im Moment hab ich nur keinerlei techn. Ansatz dafür.
Irgendwelche Ideen?

Danke 🙂

12.03.2020 - 11:36 Uhr

Ok - immerhin lässt sich der Zertifikate Check pauschal akzeptieren.

ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

Das haben zuvor ja doch schon so einige so gelöst. Da ich’s ich nur für das Testsystem benötige ist das OK.

Wenn jemand einen Hinweis liefern könnte, wäre es dennoch interessant zu wissen, wie man Zertifikatsinformationen abfragen kann.

ServicePoint servicecPoint = ServicePointManager.FindServicePoint(new Uri(@"https://www.google.de/"));
X509Certificate cert = svcPoint.Certificate;

cert enthält in dem Fall nichts. Wird es evtl. erst später nachgeladen?

11.03.2020 - 17:49 Uhr

Danke Abt,
ja richtig. Es handelt sich um einen generieren WebService zu SOAP und benutzte ein Self-Zertifikat. Wenn man die IDE ausschließen kann ist da ja schon mal ne Eingrenzung - Danke, ich schau mal weiter.

11.03.2020 - 17:14 Uhr

Hallo zusammen,

vielleicht kann mir hier jemand nen Tipp geben. Ich nutze VS Express und möchte via WebService eine Verbindung mit verschiedenen Zielservern aufbauen. Die URLs sind SSL verschlüsselt.


Session.SessionWebServiceClient session = null;
session = new Session.SessionWebServiceClient("SessionWebService", url + "/ws/services/SessionWebService");
bool connected = session.hasSubject(); // Checks if a user is logged-in for the current session.
if (!connected)
{
   //Try to connect
   try
   {
      session.logIn(user, password);
   }
}

Funktionierte bisher bisher gut. Bei einem neu hinzugekommener Server wirft session.hasSubject() eine System.ServiceModel.Security.SecurityNegotiationException.
Das Zertifikat wird nicht erkannt/ gefunden

Ja und jetzt die Frage … Wo/ Wie muss des Zertifikat hinterlegt werden?
Im Windows certmgr habe ich es importiert. Ich ging bisher davon aus, dass dieser abgeprüft wird.
Scheint aber nicht so zu sein. Hat VS einen eigenen Store bzw. Wäre schön wenn jemand die Technolgie kurz erläutern könnte.
Danke Euch