WinForm Multithreading. Utilizzare backgroundWorker o no?

Ho una semplice app che spara una serie di dati di intensità di attività. Non sono molto esperto con WinForms e mi chiedevo il modo migliore per farlo senza bloccare l’interfaccia. Può backgroundWorker essere ri-utilizzato, o c’è un altro modo per fare questo?

Grazie

  • Vorrei utilizzare il backgroundworker.
  • Se avete solo bisogno di un altro thread vorrei utilizzare un operaio di sfondo, sono molto facili da usare e la maggior parte del lavoro è stato fatto, fornendo un dritto in avanti, eventi per le diverse fasi di realizzazione dei lavori.
  • Che cosa si intende per ri-utilizzato?
  • Utilizzare Backgroundworker se avete bisogno di questo thread per interagire con gli elementi dell’interfaccia utente, dopo aver terminato il suo intenso lavoro. L’altro saggio se si desidera solo un po di lavoro, per esempio il riempimento di alcuni contenitore di dati provenienti da altrove, che viene utilizzato dall’interfaccia utente Principale in un altro momento o un evento, quindi utilizzare filo normale.
  • Beh, non si possono sparare fuori diversi compiti che quindi eseguire le operazioni di database attraverso il entityFramework. Così, quando l’utente ha terminato l’attività, può backgroundworker essere utilizzati per attività di B?
  • dotnetperls.com/backgroundworker
  • La mia preoccupazione è con l’aggiunta di mio “lungo l’esecuzione di un’operazione logica” la DoWork evento. Ho un certo numero di attività che è necessario eseguire e non mi sembra pratico per aggiungere tutti per quello DoWork evento.

InformationsquelleAutor Brian | 2012-07-16



4 Replies
  1. 7

    backgroundWorker può essere utilizzato.

    suo vantaggio – consente di aggiornare una barra di avanzamento e di interagire con i controlli dell’interfaccia utente. (WorkerReportsProgress)

    Inoltre ha un meccanismo di cancellazione. (WorkerSupportsCancellation)

    WinForm Multithreading. Utilizzare backgroundWorker o no?

  2. 5

    BackgroundWorker è un thread che comprende anche la notifica di sincronizzazione. Per esempio, se si desidera aggiornare l’interfaccia utente quando la scansione è completata, un regolare Thread non possono accedere all’interfaccia utente di oggetti (solo il thread dell’interfaccia utente che può fare); così, BackgroundWorker fornisce un gestore eventi Completati, che viene eseguito sul thread dell’interfaccia utente quando l’operazione viene completata.

    per ulteriori informazioni vedere: Scenario: il Multithreading con il Componente BackgroundWorker (informazioni in lingua inglese)

    e un semplice esempio di codice:

    var worker = new System.ComponentModel.BackgroundWorker();
    worker.DoWork += (sender,e) => Thread.Sleep(60000);
    worker.RunWorkerCompleted += (sender,e) => MessageBox.Show("Hello there!");
    worker.RunWorkerAsync();
  3. 4

    È possibile utilizzare BackgroundWorker per tali requisiti. Di seguito è riportato un esempio che updates a label status based on percentage task [long running] completion. Inoltre, c’è un modello di business class che imposta un qualche valore, e il valore viene impostato su UI via ProgressChanged gestore. DoWork è il luogo dove si scrive la lunga esecuzione di un’operazione logica. Copia e Incolla il codice riportato di seguito dopo l’aggiunta di un’etichetta e componente backgroundworker su un form di windows app & dare un colpo. È possibile eseguire il debug in vari gestore [RunWorkerCompleted, ProgressChanged, DoWork] e guarda InitWorker metodo. Notare il cancellation feature troppo.

    using System.ComponentModel;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form3 : Form
        {
            private BackgroundWorker _worker;
            BusinessClass _biz = new BusinessClass();
            public Form3()
            {
                InitializeComponent();
                InitWorker();
            }
    
            private void InitWorker()
            {
                if (_worker != null)
                {
                    _worker.Dispose();
                }
    
                _worker = new BackgroundWorker
                {
                    WorkerReportsProgress = true,
                    WorkerSupportsCancellation = true
                };
                _worker.DoWork += DoWork;
                _worker.RunWorkerCompleted += RunWorkerCompleted;
                _worker.ProgressChanged += ProgressChanged;
                _worker.RunWorkerAsync();
            }
    
    
            void DoWork(object sender, DoWorkEventArgs e)
            {
                int highestPercentageReached = 0;
                if (_worker.CancellationPending)
                {
                    e.Cancel = true;
                }
                else
                {
                    double i = 0.0d;
                    int junk = 0;
                    for (i = 0; i <= 199990000; i++)
                    {
                        int result = _biz.MyFunction(junk);
                        junk++;
    
                        //Report progress as a percentage of the total task.
                        var percentComplete = (int)(i / 199990000 * 100);
                        if (percentComplete > highestPercentageReached)
                        {
                            highestPercentageReached = percentComplete;
                            //note I can pass the business class result also and display the same in the LABEL  
                            _worker.ReportProgress(percentComplete, result);
                            _worker.CancelAsync();
                        }
                    }
    
                }
            }
    
            void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                if (e.Cancelled)
                {
                    //Display some message to the user that task has been
                    //cancelled
                }
                else if (e.Error != null)
                {
                    //Do something with the error
                }
            }
    
            void ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                label1.Text =  string.Format("Result {0}: Percent {1}",e.UserState, e.ProgressPercentage);
            }
        }
    
        public class BusinessClass
        {
            public int MyFunction(int input)
            {
                return input+10;
            }
        }
    }
    • Grazie per la risposta dettagliata. La mia preoccupazione è con l’aggiunta di mio “lungo l’esecuzione di un’operazione logica” la DoWork evento. Ho un certo numero di attività che è necessario eseguire e non mi sembra pratico per aggiungere tutti per quello DoWork evento.

Lascia un commento