kann CheckForIllegalCrossThreadCalls Probleme verursachen?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Mono.

    Hm, dann scheint die Aussage:
    "Gets or sets a value indicating whether to catch calls on the wrong thread that access a control's Handle property when an application is being debugged."

    Generell nicht wirklich zu stimmen. Hab mir mal den Code dazu angeschaut. Interessanterweise wird CheckForIllegalCrossThreadCalls DEFAULT auf FALSE gesetzt, wenn man keinen Debugger attached:

    C#-Quellcode

    1. // Initially check for illegal multithreading based on whether the
    2. // debugger is attached.
    3. [ResourceExposure(ResourceScope.Process)]
    4. private static bool checkForIllegalCrossThreadCalls = Debugger.IsAttached;


    referencesource.microsoft.com/…ntrol.cs,f9d81f74d420451e

    Zeile 303.

    Das macht die Diskussion eigentlich überflüssig. Im Release wird checkForIllegalCrossThreadCalls Default nämlich immer auf False gesetzt. Es sei denn, man überschreibt es explizit mit true ?( .
    Die Exception wird hier ggf. geworfen:

    C#-Quellcode

    1. if (checkForIllegalCrossThreadCalls &&
    2. !inCrossThreadSafeCall &&
    3. InvokeRequired) {
    4. throw new InvalidOperationException(SR.GetString(SR.IllegalCrossThreadCall,
    5. Name));
    6. }


    Zeile 2770. Keine Ahnung warum es im BGW dann keine Exception gibt..
    Das ist meine Signatur und sie wird wunderbar sein!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mono“ ()

    Mono schrieb:

    Diskussion eigentlich überflüssig
    Jou.
    Höchstens: Nicht verwenden, das verarmt einen nur.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du hast mich falsch verstanden.

    checkForIllegalCrossThreadCalls ist bei all deinen Anwendung zur Laufzeit FALSE. Es sei denn, du setzt es explizit auf true.
    Insofern sind die Tips, dass damit Probleme auftreten können alle nichtig. Wichtig ist nur, dass man es zur DEBUG Zeit nicht auf False setzt, denn dort ist es Default auf TRUE. Damit kann man beim Debuggen die Fehler finden, während sie standardmäßig zur Laufzeit verschluckt werden.
    Hintergrund ist vermutlich die Kompatibilität zu NET 1.1, denn dort gab es CheckForIllegalCrossThreadCalls noch nicht.

    Also: Kann checkForIllegalCrossThreadCalls = false Probleme verursachen?
    Ja. Wenn es Racebedingungen, Deadlock usw. zwischen Threads gibt.

    Die größeren Probleme ergeben sich aber, wenn du es zur DEBUG Zeit auf false setzt, denn dann bekommst du im Zweifel gar nichts von den Problemen mit und zur Laufzeit kann deine Anwendung in einen instabilen Zustand geraten (bis hin zum Absturz).

    Im Grunde genommen könnte man soweit gehen und sagen, man sollte checkForIllegalCrossThreadCalls EXPLIZIT auf True setzen, denn dann stürzt die Anwendung im Zweifel auch zur Laufzeit mit einer Invalid Operation Exception ab (zumindest in den meisten Fällen). Außerdem sollte man den BGW nicht verwenden, aber das ist ja eh auch so schon "klar".

    LG
    Das ist meine Signatur und sie wird wunderbar sein!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mono“ ()