Uso di backgroundWork

di il
9 risposte

Uso di backgroundWork

Premmetto che sono alle prime armi con la programmazione in c# e avendo una funzione che necessita un certo tempo per essere eseguita, vorrei farla eseguire in background. A tal proposito avevo pensato a backgroundwork, magari si accettano consigli anche per altre modalità, il problema è che nel momento in cui vado a richiamare la mia funzione mi dice che il richiamo è presente in altro thred e da errore. Vorrei sapere come risolvere.
Di seguito inserisco un esempi semplice in cui incrementa_numeri() è molto semplice e potrebbe essere inserita all'interno di DoWork, ma vorrei evitare di farlo e richiamarla da dowork, in quanto in condizioni reali questa semplice funzione potrebbe essere molta più complessa con richiami magari ad altre.

 void incrementa_numeri()
        {
           
            int n=1000000;
            int i;

            for(i = 0; i <= n ;i++)
            {
                i = i + 1;
                incremento = incremento + 1;
                testo_lb.Text = i.ToString();
            }
        }
        
        
//l'avvio è legato ad un pulsante
    void backgraundwork_avvio()
        {
            if (backgroundWorker1.IsBusy != true)
            {
                backgroundWorker1.RunWorkerAsync();
            }
        }
        
        
//il blocco è legato ad altro pulsante 
   void backgraundwork_cancella()
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                backgroundWorker1.CancelAsync();
            }
        }
        
 private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            if (worker.CancellationPending == true)
            {
                e.Cancel = true;
            }
            else
            {
                incrementa_numeri();
            }
        }
        
        
         private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                processo_lb.Text = "Processo cancellato";
            }
            else if (e.Error != null)
            {
                processo_lb.Text = "Error: " + e.Error.Message;
            }
            else
            {
                processo_lb.Text = "Processo Terminato";
            }
        }
        
Il programma va in errore e viene scritto che il testo.lb viene richiama da altro che il thred.

Grazie anticipate delle indicazioni

9 Risposte

  • Re: Uso di backgroundWork

    Ci sono due errori principali ben visibili.

    Innanzitutto, la possibilità di "cancellare" il thread in background deve essere gestita all'interno della funzione che esegue il ciclo, sempre se vuoi gestirla: mentre esegui il ciclo, devi verificare se è stata richiesta la cancellazione e, in caso affermativo, interromperlo. Nel tuo codice tu verifichi questa condizione all'avvio, che non ha molto senso, e poi procedi spedito senza possibilità di interruzioni fino alla fine.

    In secondo luogo, ma è un aspetto molto importante, non puoi accedere agli elementi dell'interfaccia durante l'esecuzione del thread: i controlli ricevono messaggi dal thread principale che ne ha in carico la gestione, e le classi non sono "protette" per un uso da più thread contemporaneamente, a meno di non predisporre un meccanismo di sincronizzazione, quindi non puoi accedere ai controlli all'interno del tuo thread. Dovrai farti passare i parametri necessari all'elaborazione, processarli all'interno della funzione e, alla fine del processo, aggiornare l'interfaccia magari nell'evento RunWorkerCompleted.

    Prova a leggere la che, oltre a questi dettagli, ti fornisce anche esempi calzanti in merito.

    Ciao!
  • Re: Uso di backgroundWork

    Potresti trovare utili anche i capitoli 87,88,89 di questo manuale gratuito https://www.pierotofy.it/pages/guide/Guida_al_Visual_Basic_dotNET/Multithreading__Parte_I/
  • Re: Uso di backgroundWork

    Per prima cosa grazie per le indicazioni, volevo chiedere se comunque c'è qualche altro modo magari per mandare in esecuzione direttamente in background il metodo void generico come nell'esempio, magari con qualche altra cosa che non sia backgroudworker, questo perchè nella realtà avrei bisogno di mandare in background un metodo stampa() per stampare dei file docx, rtf e pdf, (associati a 3 diversi pulsanti) che richiamano un void stampa() che a sua volta richiama vari void stampa(), presenti in diverse form. E dato che l'operazione nel caso della stampa di tutti i dati di tutte le form può diventare molto lunga volevo farla lavorare in un processo separato richiamando solo il void generico stampa() che al suo interno chiamerà gli altri stampa nelle varie form, un richiamo un po come viene fatto con le funzione esempio
    
    void stampa ()
    {
        if(sezA.Checked)
            f1.sezA.stampa();
        
        if(sezB.Checked)
    	f1.sezB.stampa();
    	
    ecc......
    }
    
  • Re: Uso di backgroundWork

    minis ha scritto:


    volevo chiedere se comunque c'è qualche altro modo magari per mandare in esecuzione direttamente in background il metodo void generico come nell'esempio, magari con qualche altra cosa che non sia backgroudworker
    Qual è la problematica/limitazione che riscontri nel BackgroundWorker?
    Non ho capito bene cos'è che non si adatta bene al tuo contesto.
  • Re: Uso di backgroundWork

    Quella che se richiamo direttamente stampa() nel doWork mi da l'errore che mi dice che il richiamo è presente in altro thred e da errore.
  • Re: Uso di backgroundWork

    Se non vuoi freezare la UI e stampare in maniera asincrona, potresti lanciare un task nuovo. Guarda gli altri overload per gestire la cancellazione.
  • Re: Uso di backgroundWork

    minis ha scritto:


    Quella che se richiamo direttamente stampa() nel doWork mi da l'errore che mi dice che il richiamo è presente in altro thred e da errore.
    La chiamata a un ipotetico metodo stampa(), nella mia testa, contiene la creazione di un BackgroundWorker a cui vengono passati tutti i parametri per poter portare a termine il lavoro, senza che debba accedere alla UI per recuperarli.

    Tutti i valori che devi leggere durante la stampa, puoi leggerli e aggregarli prima di eseguirla, in modo da avere tutto quello che ti serve quando devi fattivamente utilizzarli per produrre la stampa che ti serve.

    In secondo luogo, nulla vieta al tuo BackgroundWorker di andare ad aggiornare una struttura dati condivisa, magari statica e molto semplice, scrivendo dentro di essa quello che sta facendo, e dal Form principale o secondario (o un Form apposito) usare un Timer per andare periodicamente a leggere ciò che sta avvenendo, recuperando le informazioni dalla struttura dati che viene costantemente aggiornata dal worker.

    Continuo a non comprendere questa necessità ineludibile di accedere alla UI a tutti i costi.
  • Re: Uso di backgroundWork

    Grazie vedrò di comprendere meglio la cosa
    Continuo a non comprendere questa necessità ineludibile di accedere alla UI a tutti i costi.
    questo essenzialmente è lagato alla mia incapacità di fare altro, non sapendo come per il mio caso come poter inviare i dati senza farli passare per i vari stampa() presenti nei vari form

    Di seguito un esempio di uno stampa() presente in un form
    
            #region STAMPA
            public void stampa()
            {
    
                int font_size_testo = 10;
                int font_size_tab_trasp = 10;
                int font_size_tab = 7;
                int font_size_tab_max = 8;
    
                string tipo_font_testo = "Times New Roman";
                string tipo_font_tab_trasp = "Times New Roman";
                string tipo_font_tab = "Times New Roman";
                //1cm = 28.41091f
    
                //WordDocument doc = new WordDocument();
                //Add a section & a paragraph in the empty document
                //document.EnsureMinimal();
                //Aggiungi nuova sezione
                //f1.pag = f1.doc.AddSection(); //permette di creare nuova pagina inserendo in essa tutti i dati selezionati sotto
                //Secifica margini 1cm = 28.41091f
                //f1.pag.PageSetup.Margins.All = 42.6f; //1.5cm
    
                //aggiungo paragrafo (riga di testo)
                IWParagraph par = f1.pag.AddParagraph();
    
                #region DATI GEOMETRICI
                if (f1.odocx.dati_gen_ck.Checked)
                {
                    IWTextRange testo1 = par.AppendText(descr_tb.Text + "\n\n" + "DATI GEOMETRICI\n\n");
                    //sets the font formatting of the text range
                    testo1.CharacterFormat.Bold = true;
                    testo1.CharacterFormat.FontName = tipo_font_testo;
                    testo1.CharacterFormat.FontSize = font_size_testo;
    
                    testo1 = par.AppendText("Lunghezza libera d'inflessione  L0,y = " + L0y_tb.Text + " m\n" + "Lunghezza libera d'inflessione  L0,z = " + L0z_tb.Text + " m\n"
                        + "Lunghezza efficace  Leff = " + Leff_tb.Text + " m\n");
                    //sets the font formatting of the text range
                    testo1.CharacterFormat.Bold = false;
                    testo1.CharacterFormat.FontName = tipo_font_testo;
                    testo1.CharacterFormat.FontSize = font_size_testo;
    
                    if (sez_comp_ck.Checked)
                    {
                        if (comp_y_rb.Checked)
                        {
                            testo1 = par.AppendText("\nSezione composta lungo Y\n");
                            //sets the font formatting of the text range
                            testo1.CharacterFormat.Bold = false;
                            testo1.CharacterFormat.FontName = tipo_font_testo;
                            testo1.CharacterFormat.FontSize = font_size_testo;
                        }
                        else
                        {
                            testo1 = par.AppendText("\nSezione composta lungo Z\n");
                            //sets the font formatting of the text range
                            testo1.CharacterFormat.Bold = false;
                            testo1.CharacterFormat.FontName = tipo_font_testo;
                            testo1.CharacterFormat.FontSize = font_size_testo;
                        }
    
                        testo1 = par.AppendText("\nDati montanti\n");
                        //sets the font formatting of the text range
                        testo1.CharacterFormat.Bold = true;
                        testo1.CharacterFormat.FontName = tipo_font_testo;
                        testo1.CharacterFormat.FontSize = font_size_testo;
    
                        testo1 = par.AppendText("Numero di elementi : " + n_mont_tb.Text + "\n" + "Tipo di distanziatori : " + distanz_tb.Text + "\n" + "a = " + a_tb.Text + " cm\n" +
                            "l1 = " + l1_tb.Text + " cm\n" + "l2 = " + l2_tb.Text + " cm\n" + "Tipo di connessioni tra distanziatori : " + connes_tb.Text + "\n");
                        //sets the font formatting of the text range
                        testo1.CharacterFormat.Bold = false;
                        testo1.CharacterFormat.FontName = tipo_font_testo;
                        testo1.CharacterFormat.FontSize = font_size_testo;
                    }
    
                    //TABELLA
                    //aggiungi tabella
                    IWTable tabella = f1.pag.AddTable();
                    tabella.TableFormat.Borders.BorderType = Syncfusion.DocIO.DLS.BorderStyle.None;
                    //Creare il numero specifico di righe e colonne
                    int rig = 1;
                    int col = 3;
                    tabella.ResetCells(rig, col);
    
                    /*- Inserire sceglie la cella di riferimento impostando la variabile cella dopo averla creata da WtableCell, va creata una sola volta
                     *- aggiungere una riga (paragrafo alla cella creata e non alla pagaina come nel caso sopra delle righe.
                     *- inserire il testo da mettere nelle celle creando variabile testo celle tramite IWTextRange (va fatto solo per la prima volta
                     *- inserire le righe con le impostazioni del testo
                     * 
                     *- ripetere per tutte le colonne senza creare nuove variabili
                     * 
                     * E' possibile usare il comando cella.Whidt se voglio impostare la dimensione specifica di una cella e successivamente in altra cella (es . 0;1)
                     * il comando tabella.TableFormat.IsAutoResized = true; per rendere con allineamento automatico l'altra (questa forse è meglio inserirla alla fine.
                     * 
                    */
    
    
                    #region DATI GEOMETRICI SEZ A
                    if (f1.odocx.dati_A_ck.Checked)
                    {
                        WTableCell cella = tabella.Rows[0].Cells[0];
                        //larghezza 10 = 0.35cm, 1cm = 28.57
                        //cella.Width = 40;
                        //tabella.TableFormat.IsAutoResized = true;
                        cella.CellFormat.VerticalAlignment = VerticalAlignment.Top;
                        par = cella.AddParagraph();
                        par.ParagraphFormat.HorizontalAlignment = Syncfusion.DocIO.DLS.HorizontalAlignment.Left;
                        //E' opportuno dal secondo in poi inserire \n\n
                        IWTextRange testo_celle = par.AppendText("Sezione A\n");
                        testo_celle.CharacterFormat.Bold = true;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        testo_celle = par.AppendText("B = " + Bz_seza_tb.Text + " cm\n" + "H = " + Hy_seza_tb.Text + " cm\n\n");
                        testo_celle.CharacterFormat.Bold = false;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        if (fori_seza_ck.Checked)
                        {
                            testo_celle = par.AppendText("Sezione ridotta per fori/Intagli\n");
                            testo_celle.CharacterFormat.Bold = false;
                            testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                            testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                            testo_celle = par.AppendText("B rid = " + Brid_seza_tb.Text + " mm\n" + "H rid = " + Hrid_seza_tb.Text + " mm\n\n");
                            testo_celle.CharacterFormat.Bold = false;
                            testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                            testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
                        }
    
                        testo_celle = par.AppendText("A = " + A_seza_tb.Text + " mm²\n" + "Jy = " + Jy_seza_tb.Text + " mm4\n" + "Jz = " + Jz_seza_tb.Text + " mm4\n" +
                          "Wy = " + Wy_seza_tb.Text + " mm³\n" + "Wz = " + Wz_seza_tb.Text + " mm³\n" + "iy = " + iy_seza_tb.Text + " mm\n" + "iy = " + iy_seza_tb.Text + " mm\n" +
                          "Jtor = " + Jtor_seza_tb.Text + " mm4\n");
                        testo_celle.CharacterFormat.Bold = false;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        if (int_seza_ck.Checked)
                        {
                            if (int_inf_seza_rb.Checked)
                            {
                                testo_celle = par.AppendText("\nIntaglio inferiore\n");
                                testo_celle.CharacterFormat.Bold = false;
                                testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                                testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
                            }
                            else
                            {
                                testo_celle = par.AppendText("\nIntaglio superiore\n");
                                testo_celle.CharacterFormat.Bold = false;
                                testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                                testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
                            }
    
                            testo_celle = par.AppendText("Li = " + int_Li_seza_tb.Text + " cm\n" + "x = " + int_xi_seza_tb.Text + " cm\n");
                            testo_celle.CharacterFormat.Bold = false;
                            testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                            testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        }
                    }
                    #endregion
    
                    #region DATI GEOMETRICI SEZ C
                    if (f1.odocx.dati_C_ck.Checked)
                    {
                        WTableCell cella = tabella.Rows[0].Cells[1];
                        //larghezza 10 = 0.35cm, 1cm = 28.57
                        //cella.Width = 40;
                        //tabella.TableFormat.IsAutoResized = true;
                        cella.CellFormat.VerticalAlignment = VerticalAlignment.Top;
                        par = cella.AddParagraph();
                        par.ParagraphFormat.HorizontalAlignment = Syncfusion.DocIO.DLS.HorizontalAlignment.Left;
                        //E' opportuno dal secondo in poi inserire \n\n
                        IWTextRange testo_celle = par.AppendText("Sezione C\n");
                        testo_celle.CharacterFormat.Bold = true;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        testo_celle = par.AppendText("B = " + Bz_sezc_tb.Text + " cm\n" + "H = " + Hy_sezc_tb.Text + " cm\n\n");
                        testo_celle.CharacterFormat.Bold = false;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        if (fori_seza_ck.Checked)
                        {
                            testo_celle = par.AppendText("Sezione ridotta per fori/Intagli\n");
                            testo_celle.CharacterFormat.Bold = false;
                            testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                            testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                            testo_celle = par.AppendText("B rid = " + Brid_sezc_tb.Text + " mm\n" + "H rid = " + Hrid_sezc_tb.Text + " mm\n\n");
                            testo_celle.CharacterFormat.Bold = false;
                            testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                            testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
                        }
    
                        testo_celle = par.AppendText("A = " + A_sezc_tb.Text + " mm²\n" + "Jy = " + Jy_sezc_tb.Text + " mm4\n" + "Jz = " + Jz_sezc_tb.Text + " mm4\n" +
                          "Wy = " + Wy_sezc_tb.Text + " mm³\n" + "Wz = " + Wz_sezc_tb.Text + " mm³\n" + "iy = " + iy_sezc_tb.Text + " mm\n" + "iy = " + iy_sezc_tb.Text + " mm\n" +
                          "Jtor = " + Jtor_sezc_tb.Text + " mm4\n");
                        testo_celle.CharacterFormat.Bold = false;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
    
                    }
                    #endregion
    
                    #region DATI GEOMETRICI SEZ B
                    if (f1.odocx.dati_A_ck.Checked)
                    {
                        WTableCell cella = tabella.Rows[0].Cells[2];
                        //larghezza 10 = 0.35cm, 1cm = 28.57
                        //cella.Width = 40;
                        //tabella.TableFormat.IsAutoResized = true;
                        cella.CellFormat.VerticalAlignment = VerticalAlignment.Top;
                        par = cella.AddParagraph();
                        par.ParagraphFormat.HorizontalAlignment = Syncfusion.DocIO.DLS.HorizontalAlignment.Left;
                        //E' opportuno dal secondo in poi inserire \n\n
                        IWTextRange testo_celle = par.AppendText("Sezione B\n");
                        testo_celle.CharacterFormat.Bold = true;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        testo_celle = par.AppendText("B = " + Bz_sezb_tb.Text + " cm\n" + "H = " + Hy_sezb_tb.Text + " cm\n\n");
                        testo_celle.CharacterFormat.Bold = false;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        if (fori_seza_ck.Checked)
                        {
                            testo_celle = par.AppendText("Sezione ridotta per fori/Intagli\n");
                            testo_celle.CharacterFormat.Bold = false;
                            testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                            testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                            testo_celle = par.AppendText("B rid = " + Brid_sezb_tb.Text + " mm\n" + "H rid = " + Hrid_sezb_tb.Text + " mm\n\n");
                            testo_celle.CharacterFormat.Bold = false;
                            testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                            testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
                        }
    
                        testo_celle = par.AppendText("A = " + A_sezb_tb.Text + " mm²\n" + "Jy = " + Jy_sezb_tb.Text + " mm4\n" + "Jz = " + Jz_sezb_tb.Text + " mm4\n" +
                          "Wy = " + Wy_sezb_tb.Text + " mm³\n" + "Wz = " + Wz_sezb_tb.Text + " mm³\n" + "iy = " + iy_sezb_tb.Text + " mm\n" + "iy = " + iy_sezb_tb.Text + " mm\n" +
                          "Jtor = " + Jtor_sezb_tb.Text + " mm4\n");
                        testo_celle.CharacterFormat.Bold = false;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        if (int_sezb_ck.Checked)
                        {
                            if (int_inf_sezb_rb.Checked)
                            {
                                testo_celle = par.AppendText("\nIntaglio inferiore\n");
                                testo_celle.CharacterFormat.Bold = false;
                                testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                                testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
                            }
                            else
                            {
                                testo_celle = par.AppendText("\nIntaglio superiore\n");
                                testo_celle.CharacterFormat.Bold = false;
                                testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                                testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
                            }
    
                            testo_celle = par.AppendText("Li = " + int_Li_sezb_tb.Text + " cm\n" + "x = " + int_xi_sezb_tb.Text + " cm\n");
                            testo_celle.CharacterFormat.Bold = false;
                            testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                            testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        }
                    }
                    #endregion  
                }
                #endregion
    
                #region CARATTERISTICHE MATERIALI
                if(f1.odocx.car_mec_ck.Checked)
                {
                    IWParagraph par1 = f1.pag.AddParagraph();
    
                    IWTextRange testo1 = par1.AppendText("\nCARATTERITICHE MATERIALE\n\n");
                    //sets the font formatting of the text range
                    testo1.CharacterFormat.Bold = true;
                    testo1.CharacterFormat.FontName = tipo_font_testo;
                    testo1.CharacterFormat.FontSize = font_size_testo;
    
                    testo1 = par1.AppendText("Tipo : " + tipo_tb.Text + "\n" + tipo1_tb.Text + "\n");
                    //sets the font formatting of the text range
                    testo1.CharacterFormat.Bold = false;
                    testo1.CharacterFormat.FontName = tipo_font_testo;
                    testo1.CharacterFormat.FontSize = font_size_testo;
    
                    if(sistema_qualita_ck.Checked)
                    {
                        testo1 = par1.AppendText(sistema_qualita_ck.Text + "\n");
                        //sets the font formatting of the text range
                        testo1.CharacterFormat.Bold = false;
                        testo1.CharacterFormat.FontName = tipo_font_testo;
                        testo1.CharacterFormat.FontSize = font_size_testo;
                    }
    
                    testo1 = par1.AppendText("Classe di servizio : " + cl_servizio_tb.Text + "\n");
                    //sets the font formatting of the text range
                    testo1.CharacterFormat.Bold = false;
                    testo1.CharacterFormat.FontName = tipo_font_testo;
                    testo1.CharacterFormat.FontSize = font_size_testo;
    
                    //TABELLA
                    //aggiungi tabella
                    IWTable tabella = f1.pag.AddTable();
                    tabella.TableFormat.Borders.BorderType = Syncfusion.DocIO.DLS.BorderStyle.None;
                    //Creare il numero specifico di righe e colonne
                    int rig = 1;
                    int col = 3;
                    tabella.ResetCells(rig, col);
    
                    /*- Inserire sceglie la cella di riferimento impostando la variabile cella dopo averla creata da WtableCell, va creata una sola volta
                     *- aggiungere una riga (paragrafo alla cella creata e non alla pagaina come nel caso sopra delle righe.
                     *- inserire il testo da mettere nelle celle creando variabile testo celle tramite IWTextRange (va fatto solo per la prima volta
                     *- inserire le righe con le impostazioni del testo
                     * 
                     *- ripetere per tutte le colonne senza creare nuove variabili
                     * 
                     * E' possibile usare il comando cella.Whidt se voglio impostare la dimensione specifica di una cella e successivamente in altra cella (es . 0;1)
                     * il comando tabella.TableFormat.IsAutoResized = true; per rendere con allineamento automatico l'altra (questa forse è meglio inserirla alla fine.
                     * 
                    */
    
    
                    #region RESISTENZA CARATTERISTICA
                    if (f1.odocx.rck_ck.Checked)
                    {
                        WTableCell cella = tabella.Rows[0].Cells[0];
                        //larghezza 10 = 0.35cm, 1cm = 28.57
                        //cella.Width = 40;
                        //tabella.TableFormat.IsAutoResized = true;
                        cella.CellFormat.VerticalAlignment = VerticalAlignment.Top;
                        par = cella.AddParagraph();
                        par.ParagraphFormat.HorizontalAlignment = Syncfusion.DocIO.DLS.HorizontalAlignment.Left;
                        //E' opportuno dal secondo in poi inserire \n\n
                        IWTextRange testo_celle = par.AppendText("Resistenza Caratteristica\n");
                        testo_celle.CharacterFormat.Bold = true;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        testo_celle = par.AppendText("f m,k = " + fmk_tb.Text + " N/mmq\n" + "f t,0,k = " + ft0k_tb.Text + " N/mmq\n" + "f t,90,k = " + ft90k_tb.Text + " N/mmq\n" +
                            "f c,0,k = " + fc0k_tb.Text + " N/mmq\n" + "f c,90,k = " + fc90k_tb.Text + " N/mmq\n" + "f v,k = " + fvk_tb.Text + " N/mmq\n");
                        testo_celle.CharacterFormat.Bold = false;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                    }
                    #endregion
    
                    #region MASSA VOLUMETRICA
                    if (f1.odocx.mass_ck.Checked)
                    {
                        WTableCell cella = tabella.Rows[0].Cells[1];
                        //larghezza 10 = 0.35cm, 1cm = 28.57
                        //cella.Width = 40;
                        //tabella.TableFormat.IsAutoResized = true;
                        cella.CellFormat.VerticalAlignment = VerticalAlignment.Top;
                        par = cella.AddParagraph();
                        par.ParagraphFormat.HorizontalAlignment = Syncfusion.DocIO.DLS.HorizontalAlignment.Left;
                        //E' opportuno dal secondo in poi inserire \n\n
                        IWTextRange testo_celle = par.AppendText("Massa volumetrica\n");
                        testo_celle.CharacterFormat.Bold = true;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        testo_celle = par.AppendText("? k = " + rhok_tb.Text + " kg/mc\n" + "? mean = " + rhomean_tb.Text + " kg/mc\n");
                        testo_celle.CharacterFormat.Bold = false;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                    }
                    #endregion
    
                    #region MODULI ELASTICI
                    if (f1.odocx.E_ck.Checked)
                    {
                        WTableCell cella = tabella.Rows[0].Cells[2];
                        //larghezza 10 = 0.35cm, 1cm = 28.57
                        //cella.Width = 40;
                        //tabella.TableFormat.IsAutoResized = true;
                        cella.CellFormat.VerticalAlignment = VerticalAlignment.Top;
                        par = cella.AddParagraph();
                        par.ParagraphFormat.HorizontalAlignment = Syncfusion.DocIO.DLS.HorizontalAlignment.Left;
                        //E' opportuno dal secondo in poi inserire \n\n
                        IWTextRange testo_celle = par.AppendText("Moduli elastici\n");
                        testo_celle.CharacterFormat.Bold = true;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                        testo_celle = par.AppendText("E 0,mean = " + E0mean_tb.Text + " N/mmq\n" + "E 0,05 = " + E005_tb.Text + " N/mmq\n" + "E 90,mean = " + E90mean_tb.Text + " N/mmq\n" +
                            "E 90,05 = " + E90005_tb.Text + " N/mmq\n" + "G mean = " + Gmean_tb.Text + " N/mmq\n" + "G 0,05 = " + G005_tb.Text + " N/mmq\n");
                        testo_celle.CharacterFormat.Bold = false;
                        testo_celle.CharacterFormat.FontName = tipo_font_tab_trasp;
                        testo_celle.CharacterFormat.FontSize = font_size_tab_trasp;
    
                    }
                    #endregion
                }
                #endregion
    
            }
            #endregion
    
    
    di questi stampa ne ho altri 18, ognuno in un aspecifica form, che vengono richiamati dalla form da me fatta per la stampa passando per un metodo (che inserisco di seguto)
    
      void stampa()
            {
                f1.pag = f1.doc.AddSection();
    
                f1.pag.PageSetup.Margins.All = 42.6f; //1.5cm
    
                if(dati_gen_ck.Checked || car_mec_ck.Checked)
                    f1.sem.stampa();
    
                if (incendio_ck.Checked)
                    f1.sinc.stampa();
    
                if (traz_par_ck.Checked)
                {
                    f1.copia_dati_per_ver_traz_par();
                    f1.traz_par.stampa();
                }
                
    
                if (comp_par_ck.Checked)
                {
                    f1.copia_dati_per_ver_comp_par();
                    f1.comp_par.stampa();
                }
    
                if (inst_eul_ck.Checked)
                {
                    f1.copia_dati_per_ver_inst_euler();
                    f1.inst_eul.stampa();
                }
    
                if (taglio_ck.Checked)
                {
                    f1.copia_dati_per_ver_taglio();
                    f1.taglio.stampa();
                }
    
                if (flex_ck.Checked)
                {
                    f1.copia_dati_per_ver_flex();
                    f1.flex.stampa();
                }
    
                if (sverg_ck.Checked)
                {
                    f1.copia_dati_per_ver_sverg();
                    f1.sverg.stampa();
                }
    
                if (presflex_ck.Checked)
                {
                    f1.copia_dati_per_ver_pflex();
                    f1.pflex.stampa();
                }
    
                if (inst_pf_ck.Checked)
                {
                    f1.copia_dati_per_ver_ipflex();
                    f1.ipflex.stampa();
                }
    
                if (tensflex_ck.Checked)
                {
                    f1.copia_dati_per_ver_tflex();
                    f1.tflex.stampa();
                }
    
                if (inst_tf_ck.Checked)
                {
                    f1.copia_dati_per_ver_itflex();
                    f1.itflex.stampa();
                }
    
                if (tors_ck.Checked)
                {
                    f1.copia_dati_per_ver_torsione();
                    f1.tor.stampa();
                }
    
                if (tt_ck.Checked)
                {
                    f1.copia_dati_per_ver_torsione_taglio();
                    f1.ttor.stampa();
                }
    
                if (comp_ort_ck.Checked)
                {
                    f1.copia_dati_per_ver_comp_ort();
                    f1.comp_ort.stampa();
                }
    
                if (comp_incl_ck.Checked)
                {
                    f1.copia_dati_per_ver_comp_incl();
                    f1.comp_incl.stampa();
                }
    
                if (traz_ort_ck.Checked)
                {
                    f1.copia_dati_per_ver_traz_ort();
                    f1.traz_ort.stampa();
                }
    
               
            }
    
    metodo che viene a sua volta richiamato all'interno di pulsante a cui sono associate lil codice sotto
    
    private void stampa_docx_bt_Click(object sender, EventArgs e)
            {
                
    
    
                //saveFileDocx.FileName = f1.dvc.descrizione_tb.Text;
    
                if (metodo_calc_ck.Checked)
                {
                    string file_model = Application.StartupPath + ("\\stampa\\Nota_calcolo.docx");
                    string file_temp = Application.StartupPath + ("\\stampa\\stampa_inter.docx");
    
                    //avvia_backgroudWorker();
    
                    stampa(sender, e);
                    f1.doc.Save(file_temp);
                    f1.doc.Close();
    
                    WordDocument sourceDocument = new WordDocument(file_temp);
                    //Opens the destination document 
                    WordDocument destinationDocument = new WordDocument(file_model);
    
                    //Imports the contents of source document at the end of destination document
                    destinationDocument.ImportContent(sourceDocument, ImportOptions.UseDestinationStyles);
                    //Saves the destination document
    
                    if (saveFileDocx.ShowDialog() == DialogResult.OK)
                    {
                   
                        try
                        {
                            destinationDocument.Save(saveFileDocx.FileName, FormatType.Docx);
                            //closes the document instances
                            sourceDocument.Close();
                            destinationDocument.Close();
    
                            MessageBox.Show("Salvataggio file docx eseguito correttamente in \n\n" + saveFileDocx.FileName, "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        catch (Exception)
                        {
                            MessageBox.Show("DOCUMENTO DOCX APERTO CHIDERE IL DOCUMENTO E STAMPARE NUOVAMENTO", "ATTENZIONE", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
    
                    if (apri_stampa_ck.Checked)
                    {
                        try
                        {
                            System.Diagnostics.Process.Start(saveFileDocx.FileName);
                        }
                        catch (Exception)
                        {
    
                        }
                    }
    
                }
                else
                {
                    if (saveFileDocx.ShowDialog() == DialogResult.OK)
                    {
                        
                        try
                        {
                            //avvia_backgroudWorker();
    
                            stampa(sender, e);
                            f1.doc.Save(saveFileDocx.FileName);
                            f1.doc.Close();
    
                            MessageBox.Show("Salvataggio file docx eseguito correttamente in \n\n" + saveFileDocx.FileName, "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        catch (Exception)
                        {
                            MessageBox.Show("DOCUMENTO DOCX APERTO CHIDERE IL DOCUMENTO E STAMPARE NUOVAMENTO", "ATTENZIONE", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
    
                    if (apri_stampa_ck.Checked)
                    {
                        try
                        {
                            System.Diagnostics.Process.Start(saveFileDocx.FileName);
                        }
                        catch (Exception)
                        {
    
                        }
                    }
    
                }
    
            }
    
  • Re: Uso di backgroundWork

    minis ha scritto:


    non sapendo come per il mio caso come poter inviare i dati senza farli passare per i vari stampa() presenti nei vari form
    Invece di leggere i dati dal Form durante la stampa, li leggi prima, li memorizzi all'interno di un oggetto appartenente a una classe fatta da te, con campi specifici per contenere il valore delle opzioni che vai a raccogliere in giro, e passi quell'oggetto opportunamente creato e inizializzato a dovere al BackgroundWorker che si occuperà di effettuare la stampa.
Devi accedere o registrarti per scrivere nel forum
9 risposte