È necessario utilizzare backgroundworker, è esattamente ciò che si desidera.
Eather trascinalo dalla casella degli strumenti o crealo in code - behind. Supporta l'annullamento, segnala lo stato di avanzamento, avvisa quando è completo e sa se è in esecuzione o meno.
Ecco un esempio.
void method(){
BackgroundWorker worker = new BackgroundWorker();
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.ProgressChanged += worker_ProgressChanged;
worker.DoWork += worker_DoWork;
worker.WorkerSupportsCancellation = true;
if(!worker.IsBusy)
{
worker.RunWorkerAsync();
}
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
//do whatever needs to be done on the other thread here.
object argument = e.Argument; //if passed argument in RunWorkerAsync().
object result = new object();
e.Result = result;
//after making worker global, you can report progress like so:
worker.ReportProgress(50); //you can also pass a userState, which can be any object, to show some data already.
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//you can update a progress bar in here
int progress = e.ProgressPercentage;
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//when done
}
void CancelTheTask()
{
if (worker.IsBusy)
{
//make worker global first, but then
worker.CancelAsync();
}
}
A cose importanti da guardare: Non usare mai le risorse nel metodo DoWork
che non vengono creati al suo interno. Quindi passa le cose di cui hai bisogno in background come argomenti. E le cose create dal backgroundworker non dovrebbero essere impostate su una variabile globale etere, passare per risultato.
per l'annullamento, RunWorkCompleted
sarà anche essere licenziato. Ora la query al database è già in esecuzione, in modo che è ancora in esecuzione, anche quando l'applicazione ha perso tutte le risorse ad esso.
Per annullare ciò, è necessario sapere come si esegue la query, ad esempio @S.Akbari menzionato è a senso unico. Entity Framework 6 supporta anche la cancellazione.
Per questo: check this when using Queryable
here is another example
O questo solution senza Entity Framework.
È necessario utilizzare BackgroundWorker. Permette la cancellazione. –