Wir stellten eine Firma ein, um eine alte VB6 DLL zu konvertieren, die einige Industriemaschinen nach C# steuert. Der alte VB6-Code hatte "Pause" -Routinen, die aus Schlafanrufen bestanden, die mit DoEvents gesprenkelt wurden, so dass während des Schlafens Timer- und Socket-Ereignisse in der DLL noch verarbeitet würden. Die DoEvents wurdenWas tun DoEvents() in C# eigentlich?
umgewandeltSystem.Windows.Forms.Application.DoEvents();
Ich bin kein VB6 Programmierer, aber mein Verständnis ist, dass VB6 tatsächlich single-threaded ist und so ein langer Schlaf würde Handhabung alles, einschließlich Timer und Buchse Veranstaltung geschlossen.
Wenn der Code in C# umgewandelt wurde, sahen die Pausenroutinen so aus. . .
public static void pauseit_ms(ref int milliseconds)
{
try
{
Sleep(milliseconds/2);
System.Windows.Forms.Application.DoEvents();
Sleep(milliseconds/2);
}
catch (Exception exc)
{
LogException("pauseit_ms", exc);
}
}
In .Net, Timer und Socket-Ereignisse in ihrem eigenen Threads ausgeführt (in diesem die meisten meiner Arbeit umgewandelt Code war zu versuchen, es Thread-sicher zu machen!) So offensichtlich, es ist nicht das, was die DoEvents () kauft uns. Aber die MSDN sagt
Der Aufruf dieser Methode bewirkt, dass der aktuelle Thread ausgesetzt werden, während alle wartenden Fenster Nachrichten verarbeitet werden.
Also sollten wir verlassen diese DoEvents() in so andere Arten von Veranstaltungen (nicht Rückrufe Timer oder Buchse) nicht blockiert werden? Oder sind sie in einem .Net/C# -Kontext überflüssig?
FYI, 'DoEvents' ist nicht Teil von C#. Es ist Teil von .NET Framework. –
Klingt so, als hätte die Firma, die Sie angestellt haben, eine 1: 1-Konvertierung durchgeführt, ohne sich darum gekümmert zu haben, wie der Code tatsächlich funktioniert. –