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.