Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di kakashi
    Registrato dal
    Feb 2005
    Messaggi
    357

    [C#] Eseguire una operazione dopo il termine della precedenete

    Salve ragazzi, scusate se vi pongo questa domanda può sembrarvi banale, ma proprio non riesco a capire.
    Vi spiego, dopo aver premuto sul solito button si avvia una procedura relativamente lunga ( varia dalla quantità di dati ).

    Per prima cosa mi collego ad un database SQL, per effettuare la copia dello stesso, fatto questo, comprimo varie cartelle, salvando tutto in un'unica sotto cartella con la data.

    Una volta che ha fatto tutto questo dovrebbe partire un upload dei dati su Google Drive.

    Il problema che l'operazione riguardante il caricamento dei dati su Google Drive, che si avvia prima che le operazioni si concludano.
    Vi inserisco il codice sperando che qualcuno possa aiutarmi o spiegarmi il meccanismo.

    Grazie

    codice:
    private void do_Work(object sender, DoWorkEventArgs e)
            {
                conn = new SqlConnection(st);
                conn.Open();
    
    
                SqlCommand sqlDBrestoreCommand = new SqlCommand();
                sqlDBrestoreCommand.Connection = conn;
                sqlDBrestoreCommand.CommandText = "Use Master";
                sqlDBrestoreCommand.ExecuteNonQuery();
    
    
                Directory.CreateDirectory(UpdateTe.Properties.Settings.Default.FolderSave + "\\Save-" + DateTime.Now.ToString("dd_MMMM_yyyy") + "-" + timelinux);
    
    
                DirectorySecurity sec = Directory.GetAccessControl(UpdateTe.Properties.Settings.Default.FolderSave + "\\Save-" + DateTime.Now.ToString("dd_MMMM_yyyy") + "-" + timelinux);
                SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
                sec.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.Modify | FileSystemRights.Synchronize, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
                Directory.SetAccessControl(UpdateTele.Properties.Settings.Default.FolderSave + "\\Save-" + DateTime.Now.ToString("dd_MMMM_yyyy") + "-" + timelinux, sec);
    
    
                sqlDBrestoreCommand.CommandText = "BACKUP DATABASE [DB.net] TO  DISK = N'" + UpdateTe.Properties.Settings.Default.FolderSave + "\\Save-" + DateTime.Now.ToString("dd_MMMM_yyyy") + "-" + timelinux + "\\Database.bak' WITH NOFORMAT, NOINIT,  NAME = N'Completo Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10";
                sqlDBrestoreCommand.ExecuteNonQuery();
                conn.Close();
    
    
                ProgressBar3.Value = 100;            
    
    
                string[] filePaths = Directory.GetFiles(@"c:\FolderSave\", "*.*", SearchOption.AllDirectories);
                double conunt = filePaths.Count();
    
    
                using (var zip = System.IO.File.OpenWrite(UpdateTe.Properties.Settings.Default.FolderSave + "\\Save-" + DateTime.Now.ToString("dd_MMMM_yyyy") + "-" + timelinux + "\\archive.zip"))
                using (
                    var zipWriter = WriterFactory.Open(
                        zip,
                        ArchiveType.Zip,
                        CompressionType.Deflate
                    )
                )
                {
                    double cProgress = 0;
                    progressBarBackup.Maximum = 100;
                    progressBarBackup.Minimum = 0;
                    foreach (var filePath in filePaths)
                    {
                        cProgress = cProgress + 1;
                        double Avanzo = (cProgress / conunt) * 100;
                        if (!Path.GetDirectoryName(filePath).Contains("pdf"))
                        {
                            zipWriter.Write(filePath, filePath);
                        }
                        progressBarBackup.Value = (int)Avanzo;
                    }
                }
            }
    
    
            private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                ServiceController sc = new ServiceController(TextBox2.Text);
                ResultService = sc.Status.ToString();
                try
                {
                    ProgressBar4.Value = 50;
                    if (sc.Status.Equals(ServiceControllerStatus.Stopped))
                    {
                        sc.Start();
                        sc.WaitForStatus(ServiceControllerStatus.Running);
                        ProgressBar4.Value = 100;
                    }
                    else
                    {
                        ProgressBar4.Value = 100;
                    }
                }
                catch (Exception es)
                {
                    buttonGdrive.Enabled = true;
                    Button1.Enabled = true;
                }
                return;
            }
    
    private void buttonGdrive_Click(object sender, EventArgs e)
            {
                buttonGdrive.Enabled = false;
                Button1.Enabled = false;
    
    
                timelinux = DateTime.Now.Ticks.ToString();
                string FolderSaveNow = "Save - " + DateTime.Now.ToString("dd_MMMM_yyyy") + " - " + timelinux;
    
    
                if (string.IsNullOrEmpty(UpdateTe.Properties.Settings.Default.FolderSave) || string.IsNullOrEmpty(UpdateTe.Properties.Settings.Default.ServiceApache))
                {
                    TabControl1.SelectedTab = TabPage2;
                    if (string.IsNullOrEmpty(UpdateTe.Properties.Settings.Default.FolderSave))
                        TextBox5.Focus();
                    if (string.IsNullOrEmpty(UpdateTe.Properties.Settings.Default.ServiceApache))
                        TextBox2.Focus();
                }
                else
                {
                    ProgressBar2.Value = 0;
                    ProgressBar3.Value = 0;
                    ProgressBar4.Value = 0;
                    progressBarBackup.Value = 0;
                    try
                    {
                        ProgressBarGDrive.Style = ProgressBarStyle.Marquee;
                        ProgressBarGDrive.MarqueeAnimationSpeed = 30;
                        ServiceController sc = new ServiceController(TextBox2.Text);
                        ResultService = sc.Status.ToString();
    
    
                        ProgressBar2.Value = 50;
                        if (sc.Status.Equals(ServiceControllerStatus.Running))
                        {
                            sc.Stop();
                            sc.WaitForStatus(ServiceControllerStatus.Stopped);
                            ProgressBar2.Value = 100;
                        }
                        else
                        {
                            ProgressBar2.Value = 100;
                        }
    
    
                        Thread tsThread = new Thread(() =>
                        {
                            UserCredential credential;
                            using (var stream = new FileStream(@"client_secret.json", FileMode.Open, FileAccess.ReadWrite))
                            {
                                string credPath = Path.GetDirectoryName(Application.ExecutablePath);
                                credPath = Path.Combine(credPath, ".credentials/drive-dotnet-quickstart");
    
    
                                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                                        GoogleClientSecrets.Load(stream).Secrets,
                                        Scopes,
                                        "user",
                                        CancellationToken.None,
                                        new FileDataStore(TextBox5.Text, true)
                                    ).Result;
                                richTextBox3.AppendText("Credential file saved to: " + credPath + Environment.NewLine);
                            }
    
    
                            var service = new DriveService(new BaseClientService.Initializer()
                            {
                                HttpClientInitializer = credential,
                                ApplicationName = ApplicationName,
                            });
    
    
                            Google.Apis.Drive.v3.Data.File fileMetadata = new Google.Apis.Drive.v3.Data.File();
                            fileMetadata.Name = FolderSaveNow;
                            fileMetadata.Description = "Backup del " + DateTime.Now.ToString("dd MMMM yyyy");
                            fileMetadata.MimeType = "application/vnd.google-apps.folder";
                            var request = service.Files.Create(fileMetadata);
                            request.Fields = "id";
                            var file = request.Execute();
                            richTextBox3.AppendText("Folder ID :" + file.Id + Environment.NewLine);
    
    
                            var folderId = file.Id;
                            Google.Apis.Drive.v3.Data.File fileMetadata_tow = new Google.Apis.Drive.v3.Data.File();
                            fileMetadata_tow.Name = "Database.bak";
                            fileMetadata_tow.Description = "Il file contiene tutti i dati del gestionale - Si consiglia di non cancellare il file";
                            fileMetadata_tow.Parents = new List<string> { folderId };
                            FilesResource.CreateMediaUpload requests;
                            using (var stream = new System.IO.FileStream(UpdateTe.Properties.Settings.Default.FolderSave + "\\" + FolderSaveNow + "\\Database.bak", System.IO.FileMode.Open))
                            {
                                requests = service.Files.Create(fileMetadata_tow, stream, "application/octet-stream");
                                requests.Fields = "id";
                                requests.Upload();
                            }
                            var files = requests.ResponseBody;
                            richTextBox3.AppendText("File .bak ID :" + files.Id + Environment.NewLine);
    
    
                            fileMetadata_tow.Name = "archive.rar";
                            fileMetadata_tow.Description = "Il file contiene i report, allegati e le fatture elettroniche - Si consiglia di non cancellare il file";
                            using (var stream = new System.IO.FileStream(UpdateTe.Properties.Settings.Default.FolderSave + "\\" + FolderSaveNow + "\\archive.rar", System.IO.FileMode.Open))
                            {
                                requests = service.Files.Create(fileMetadata_tow, stream, "application/octet-stream");
                                requests.Fields = "id";
                                requests.Upload();
                            }
                            files = requests.ResponseBody;
                            richTextBox3.AppendText("File .rar ID :" + files.Id + Environment.NewLine);
    
    
                            ProgressBarGDrive.Style = ProgressBarStyle.Continuous;
                            ProgressBarGDrive.Value = 100;
                        });
    
    
                        var bw = new BackgroundWorker();
                        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
                        bw.DoWork += new DoWorkEventHandler(do_Work);
                        bw.RunWorkerAsync();
    
    
                        tsThread.Start();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message + " " + ex.HelpLink);
                        buttonGdrive.Enabled = true;
                        Button1.Enabled = true;
                    }
                }
            }
    Ultima modifica di kakashi; 02-02-2016 a 21:18 Motivo: volevo modificare il titolo ma non si può

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2015
    Messaggi
    57
    eventualmente per la prossima volta, cerca di copiare solo le parti
    di interesse per chi legge, altrimenti districarsi nel codice risulta difficile

    comunque tirando insieme le cose
    hai tre Thread distinti
    - il Main Thread
    - per quello che gestisce il DB utilizzi l'astrazione di BackgroundWorker
    - per quello che gestisce Drive utilizzi un Thread "puro"

    Per rispondere alla domanda principale

    codice:
            private void do_Work(object sender, DoWorkEventArgs e)
            {
                // esecuzione async DB
            }
    
            private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
            }
    
            private void buttonGdrive_Click(object sender, EventArgs e)
            {
                Thread tsThread = new Thread(() =>
                {
                    // esecuzione async Drive
                });
    
                var bw = new BackgroundWorker();
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
                bw.DoWork += new DoWorkEventHandler(do_Work);
                bw.RunWorkerAsync(); // esecuzione DB
    
                tsThread.Start(); // esecuzione Drive
            }
    quando esegui l'operazione bw.RunWorkerAsync(); il thread del DB inizia le sue operazioni
    quando esegui l'operazione tsThread.Start(); il thread di Drive inizia le sue operazioni

    il problema che questo non è sequenziale, attualmente possiedi 3 sottoprocessi distinti, che concorrono a dipendenza delle decisioni del sistema operativo, significa che tu non puoi sapere in che tempo vengono svolte le operazioni

    pertanto se devi svolgere per primo le operazioni DB, e solo al termine le operazioni Drive, basta che lanci il Thread Drive al termine del Thread DB.

    codice:
            private void do_Work(object sender, DoWorkEventArgs e)
            {
                // esecuzione async DB
            }
    
    
            private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {             
                Thread tsThread = new Thread(() =>
                {
                    // esecuzione async Drive
                });
    
    
                tsThread.Start(); // esecuzione Drive
            }
    
            private void buttonGdrive_Click(object sender, EventArgs e)
            {
                var bw = new BackgroundWorker();
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
                bw.DoWork += new DoWorkEventHandler(do_Work);
                bw.RunWorkerAsync(); // esecuzione DB
            }
    Sfortunatamente nel codice presentato questo è la parte più facile da risolvere, il tuo codice soffre di grossissimi problemi di Thread-safe, oltre ad utilizzare due metodologie di Threading differenti ed ormai obsolete, non proteggi i contenuti delle tue variabili condivise (pericolosissimo), inoltre la gestione dei componenti grafici può essere eseguita unicamente dal Main Thread e dal relativo Dispatcher dell'applicativo.

    ti consiglio prima di continuare con il progetto di studiarti le dinamiche di applicazione multithread,
    puoi partire da qui: http://forum.html.it/forum/showthrea...readid=2934448, dove viene data spiegazione di problemi simili al tuo.
    Ultima modifica di Marsh; 04-02-2016 a 14:54

  3. #3
    Utente di HTML.it L'avatar di kakashi
    Registrato dal
    Feb 2005
    Messaggi
    357
    Ti ringrazio della risposta. Mi metterò subito alla lettura.
    Sono ben consapevole di avere delle mancanze, questa è la mia prima esperienza di programmazione in C# sono andato molto a intuito.

    Grazie ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.