none
come capire chi o dove vengono creati oggetti RRS feed

  • Domanda

  • Ciao a tutti,

    chiedo scusa se disturbo in un forum per C# riguardo una applicazione scritta in VB, ma non essendo il problema specifico del linguaggio, provo a chiedere anche qui.

    In una mia applicazione, dopo un po' di tempo, ho dei crash con un messaggio specifico, 

    System.ComponentModel.Win32Exception (0x80004005): Errore durante la creazione dell'handle della finestra.

    Usando il profiler integrato in VS2019, vedo che vengono creati numerosissimi timer. Sempre usando questo profiler, come posso capire chi, o dove, vengono creati questi timer? Se riuscissi a capire quale routine li crea, probabilmente per un errore nella scrittura, o magari per un "dispose" omesso, riuscirei con molta probabilità a risolvere il problema.

    Allego una schermata di quanto il profiler mi mostra.

    Sto usando VS2019 Community e, a parte qualche dll più interna, il framework di destinazione è il 4.5, e la soluzione è composta quasi esclusivamente da Windows Forms, tranne per un controllo, hostato sul form principale, scritto in WPF.

    Qualche idea?

    P.s. Lo stesso messaggio che sto mettendo qui, è stato postato anche nel forum di VB.Net, non essendo specifico del linguaggio. Sarà mia cura, se dovessi trovare una soluzione, ad aggiornare entrambi.

    Grazie

    lunedì 25 ottobre 2021 21:18

Tutte le risposte

  • Ciao vbMizio,

    Se non hai già visto i link di sotto, puoi controllarli, spero che saranno d'aiuto:

    Win32Exception

    ErrorCreatingWindowHandle

    NotEnoughStorage


    Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto fornito “as is“ non comporta alcuna responsabilità da parte dell’azienda.


    martedì 26 ottobre 2021 08:24
    Moderatore
  • Ciao Plamen, come prima cosa, ti ringrazio per la risposta.

    In effetti avevo già visto i primi due link che riporti (a proposito, il terzo, pur con un testo diverso, riporta lo stesso link del secondo), e avevo già capito che il problema fosse dovuto al raggiungimento del limite degli handle creabili. E' per questo che ho usato il profiler, ed è li che ho visto che ci sono tutti quei timer creati, e la domanda iniziale era per capire se, tramite il profiler stesso, è possibile capire chi, cosa, dove, sono stati creati questi timer. Se dovessi vedere che, ad esempio, una grossa quantità di questi timer proviene da u metodo "MioMetodo" nella "MiaClasse", andrei a vedere li dentro, e probabilmente troverei facilmente il problema.

    Nel frattempo ho fatto una piccola modifica nel codice, ho effettivamente trovato un timer che veniva creato senza che venisse distrutto il suo predecessore, e la situazione mi sembra leggermente migliorata, ma è ancora troppo presto per dirlo. Considera che sto facendo dei test, e l'unica macchina dove il problema esce fuori relativamente in breve tempo, è una macchina con Windows Server 2019 non attivato. Altri pc con Windows 10 pro, regolarmente attivati, funzionano tranquillamente e, solo in alcune condizioni (quando proprio il pezzetino di codice che ho appena sistemato è chiamato in causa) possono dare un crash una volta al mese, se non ad intervalli più lunghi. Il server 2019 invece, fino a che non cambiassi quel pezzetto di codice, andava in crash dopo uno o due giorni.

    Continuo con i test, ma la domanda originale resta comunque valida: posso riuscire a risalire al punto in cui i timer vengono creati?

    martedì 26 ottobre 2021 10:14
  • Tra l'altro, notavo solo ora, che i timer creati sono di tipo Windows.Forms.Timer, e mi è venuto sott'occhio vedendo che c'è lo stesso numero di oggetti Timer rispetto ai Timer+TimerNativeWindow e quindi NativeMethods+WndProc

    A questo punto non sembrano timer creati da codice, visto che qualora me ne servissero, userei dei System.Timers.Timer, ma sono i Timer trascinati sul form come componenti.

    Non mi resta altro che capire da dove vengono fuori questi timer di troppo.

    Ogni aiuto è benvenuto.

     

    martedì 26 ottobre 2021 11:03
  • Provo a dare qualche dettaglio in più.

    Sempre tramite profiler integrato in VS2019, ho la lista di tutte le istanze dei timer, ognuna con la catena di riferimenti. Purtroppo da questa lista non riesco a capire molto, provo a metterne una immagine, vediamo se può essere da spunto.

    martedì 26 ottobre 2021 13:46
  • Ciao,

    ho trovato una mezza risposta al mio quesito, anche se ancora qualcosa non mi torna.

    Nel far girare il software, a causa di un riferimento circolare tra due tipi di oggetti, uno teneva in piedi l'altro, e quindi non venivano mai distrutti. Uno di questi due oggetti aveva un riferimento a un altro oggetto che, tra l'altro, ha un timer di tipo System.Timers.Timer. 

    Ho quindi aggiunto l'implementazione dell'interfaccia IDisposable, quando l'oggetto non mi serve più ne chiamo il metodo Dispose che "sgancia" il riferimento, distrugge l'oggetto riferito e questo provoca anche la distruzione del timer. 

    Sembra andare tutto bene, ora.

    Quello che non mi spiego molto bene è il motivo per cui venivano mantenuti tanti riferimenti a dei timer (nell'ordine di oltre 4000 timers con una settantina di oggetti rimasti "vivi") e come mai trovavo, nella lista degli oggetti creati, dei Windows.Forms.Timer anziché dei System.Timers.Timer.

    In ogni caso, ora sembra tutto ok, nelle stesse condizioni prima avevo un crash ogni 22 ore circa, mentre ora sta girando da due settimane e mezzo.

    Grazie a chi ha prestato attenzione a questo thread.

    mercoledì 10 novembre 2021 15:05