@Quiche-Lorraine
SendMessage geht nur dann über die Message-Queue, wenn das Fenster einem anderen Thread gehört. Ansonsten wird die WindowProc direct aufgerufen. Weil das ja sonst auch nie gehen könnte.
Wenn du natürlich eine Parent/Child Beziehung zwischen Fenstern hast die unterschiedlichen Threads gehören, dann erklärt das so ziemlich alles an Problemen was du mit Deadlocks/Hangs nur haben kannst. Das ist fummelig^10 und deswegen lässt man es auch bleiben.
Ich habe da nämlich so den Verdacht dass das CreateWindow Nachrichten an das Parent Fenster schickt.
Ja, klar. Aber was CreateWindow macht oder nicht macht is ja erstmal egal, wenn sogar ein einfaches SendMessage blockt.
Dadurch kommt die Message Pump der Visualisierung aber nicht mehr an die Nachrichten des Hauptfensters heran (siehe MSDN) und, so vermute ich, kommt es zu Problemen beim setzen der Parent-Child Beziehung.
Falls du damit meinst du versuchst Nachrichten für Fenster X welches von Thread T1 erstellt wurde aus einem anderen Thread T2 zu pumpen: korrekt, das geht nicht.
Hallo Leute,
ich möchte gerne eine .net-standard-lib dotfuscaten. Da ich VS2019 verwende, dachte ich an den PreEmptive Dosfuscator. und frage ob das ne gute Entscheidung ist, oder einen anderen nehmen soll und dann welchen?
Zudem frage ich mich wieso eine build in Dotfuscation in VS vorhanden ist? und der code schon beim compilieren verschlüsselt wird!? So wie ich gelesen hab, wird ja bei den dotfuscation tools die fertige dll verschlüsselt richtig?
Was muss ich generell beachten, wenn ich dll herausgebe, damit diese nicht so einfach lesbar decompiliert werden können!?
Habt ihr da ein Tipp bzw. Vorgehensweise?;)
Danke und schönen Sonntag noch;)
@micha7 sagte in Viele Zahlen in ein Array schreiben:
stimmt, diese Lösung ist noch besser.
Aber sie ist nicht identisch und tut vor allem nicht das, was du ursprünglich gefragt hast. Denn falls du irgendwo b kopiert hast, änderst du dort die Daten nicht und hast dann 2 unterschiedliche Arrays. Du schreibst also nicht in das Array hinein, sondern nimmst einfach ein neues, anderes Array. Es ist also etwas anderes - ob es das ist, was du willst, musst du anhand deines restlichen Codes entscheiden.
Mit Linq in einer Zeile machbar: https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.max
Wahrscheinlich nicht die Idee deiner Aufgabenstellung, aber die vier Zeilen solltest du noch alleine schaffen. Ansonsten zeig was du probiert hast und/oder stelle Fragen wo du Verständnisschwierigkeiten hast.
@Mechanics sagte in Sortier-Reihenfolge im DataGridView:
DataGridView.ColumnHeaderMouseClick
Damit geht es sogar noch besser, nämlich nur wenn man in die Kopfzeile klickt.
Michael
Guten Morgen Leute,
ich habe schon bissel recherchiert umd "ConfigureAwait(false)" der TPL zu verstehen. Wenn ein Task mit ConfigureAwait(false) markiert versehen wird, dann kommt dieser in einem "anderen" Thread Context zurück.. was ich gar nicht verstehen was damit gemeint ist
Aber zuerst, habe ich den überhaupt Async/Await verstanden? Nehmen wir an ich habe 3 Aufgaben seriell zu erledigen, und jede Aufgabe gibt ein Ergebnis für die nächste zurück. Dann würde ich das ganze so mit der TPL machen:
async void DoCompleteWorkAsync()
{
object data = ...;
object myResult = null;
var resA = await DoWorkAAsync(data);
var resB = await DoWorkBAsync(resA);
var resC = await DoWorkCAsync(resB);
myResult = resC;
}
Das ist schonmal klar (denk ich). Wenn ich das ganze nun mit klassischen Thread (ohne den async/await syntatic sugar), lösen würde, würde das so ausehen : (hier verschachtele ich die Kontexte der Threads)
VAriante A:
void DoCompletWorkA()
{
object data = 0;
object myResult = null;
var waitAll = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem((i) =>
{
var resA= DoWorkA(i);
ThreadPool.QueueUserWorkItem((i1) =>
{
var resB = DoWorkB(i1);
ThreadPool.QueueUserWorkItem((i2) =>
{
var resC = DoWorkC(i2);
myResult = resC;
waitAll.Set();
}, resB);
}, resA);
}, data);
waitAll.WaitOne();
}
und nun Variante B (welche dann async/await mit ConfigureAwait gleicht.. richtig??) :
void DoCompletWorkB()
{
object data = 0;
object myResult = null;
var waitAll = new AutoResetEvent(false);
object resA = null;
ThreadPool.QueueUserWorkItem((i) =>
{
resA = DoWorkA(i);
waitAll.Set();
}, data);
waitAll.WaitOne();
object resB = null;
ThreadPool.QueueUserWorkItem((i1) =>
{
resB = DoWorkB(i1);
waitAll.Set();
}, resA);
waitAll.WaitOne();
object resC = null;
ThreadPool.QueueUserWorkItem((i2) =>
{
resC = DoWorkC(i2);
waitAll.Set();
}, resB);
waitAll.WaitOne();
myResult = resC;
}
hier springe ich immer wieder nach jeder Arbeit in den ursprungs Kontext zurück.. ist nun das was ConfigureAwait(false) tut?
Oder habe ich generell was nicht kapiert?;)
Eine generelle Liste aller Operatoren gibt es in C#-Operatoren (welche [fast] alle von den Standard-Datentypen unterstützt werden).
Eine einzelne Auflistung gibt es auch noch unter Ausdrücke: Arithmetische operatoren (und folgende Abschnitte).
Und noch ne Frage zu folgenden Code:
ich will eine list von async events ausführen, das anfügen und löschen von IAsyncEventHandler kann asynchron passieren, deswegen mach ich eine kopie via lock.. kann ich das auch elliganter lösen?
public async Task AsyncInvoke(Args input, CancellationToken cancellationToken)
{
/* need to sync _requestHandler access */
IAsyncEventHandler[] Aggregate()
{
lock (_requestHandler)
{
return _requestHandler.ToArray();
}
}
await Task.WhenAll(Aggregate());
}
EDIT: So ists wohl elegante;:
await _semaphoreSlim.WaitAsync(cancellationToken);
try
{
await Task.WhenAll(_requestHandler);
}
finally
{
_semaphoreSlim.Release();
}
}
wobei ich gelessen habe das dies zweck Threading context mit ConfigureAwait probleme machen kann?
@SoIntMan
Wenn du was von mir wissen willst ist es schlau wenn du "@hustbaer" schreibst und nicht "Husbaer". Weil ich bei "@hustbaer" sehe dass mich jemand getaggt hat, bei "Husbaer" dagegen nicht. Also auch nicht wenn du es richtig geschrieben hättest statt das "t" wegzulassen.
Woher soll ich wissen was der Code macht den du mir nicht zeigst?
Was soll sonder das disconnect mit der "überbrügung intanz vornimmt, und die alte schon null ist" heissen? Erstmal is da wohl ein dass-das Fehler drin. Dann fehlt bei "sonder" wohl ein "n" am Schluss? Und dann ... "überbrügung"? Dafuw? Und selbst wenn ich annehme dass du "überprüfung" schreiben wolltest wird da immer noch kein für mich verständlicher Satz draus.
@Dravere sagte in CefSharp / WinForms - automatisierte Mausklicks - ein Klick fehlt:
Aber ich vermute, dass es auch so nicht funktionieren wird.
Da hast du leider Recht.
Wenn der Code wirklich direkt nach Programmstart nur einmalig ausgeführt werden soll (und unabhängig von der MainForm ist), dann sollte der Code (bzw. der Aufruf) direkt in die Program.Main-Methode geschrieben werden.
Edit: Ups, das hat @hustbaer ja schon geschrieben (naja, doppelt hält besser).
@xX_Lucas_Xx sagte in Sudoku Spiel programmieren:
selbstständig ein Programm programmieren
Mach das. Vor allem den letzten Teil
@xX_Lucas_Xx sagte in Sudoku Spiel programmieren:
(Bsp. Freiberufler)
YMMD
@xX_Lucas_Xx sagte in Sudoku Spiel programmieren:
Lucas-Friedrich-Sachsen@web.de
Jetzt weiß dein Prof genau, wer durchfallen wird.