Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    6

    c# inserimento ProgressBar durante esecuzione di un metodo

    Buongiorno a tutti. Sono nuovo del forum.
    chiedo scusa in anticipo se commetto errori di sintassi o formattazione
    Ho un piccolo problema con la creazione di una ProgressBar.

    Nel mio progetto uso il MVVM e nella parte View usando codice xaml, ho fatto si che la ProgressBar
    compaia e scompaia al momento dell'esecuzione del metodo interessato che parte solo quando premo un bottone.

    In realtà la progressBar funziona con la classe BackgroundWorker, quindi, appare si, quando premo il bottone, ma scompare non alla fine del metodo, ma lavorando in modo asincrono, e termina secondo tempistiche assegnate.

    codice:
    private void bgw_DoWork(object sender, DoWorkEventArgs e)
            {
                for (int i = 0; i <= 100; i++)
                {
                    (sender as BackgroundWorker).ReportProgress(i);
                    Thread.Sleep(25);
                }
            }
    Vorrei invece che parte quando schiaccio il bottone e termina al termine del mio metodo.

    Grazie in anticipo per l'aiuto!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    I linguaggi .NET vengono trattati nel forum "Visual Basic e .NET Framework".

    Sposto.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    6
    ok grazie mille
    scusa per la svista
    ciaoooo

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da bugino Visualizza il messaggio
    Buongiorno a tutti. Sono nuovo del forum.
    chiedo scusa in anticipo se commetto errori di sintassi o formattazione
    Ho un piccolo problema con la creazione di una ProgressBar.

    Nel mio progetto uso il MVVM e nella parte View usando codice xaml, ho fatto si che la ProgressBar
    compaia e scompaia al momento dell'esecuzione del metodo interessato che parte solo quando premo un bottone.

    In realtà la progressBar funziona con la classe BackgroundWorker, quindi, appare si, quando premo il bottone, ma scompare non alla fine del metodo, ma lavorando in modo asincrono, e termina secondo tempistiche assegnate.

    codice:
    private void bgw_DoWork(object sender, DoWorkEventArgs e)
            {
                for (int i = 0; i <= 100; i++)
                {
                    (sender as BackgroundWorker).ReportProgress(i);
                    Thread.Sleep(25);
                }
            }
    Vorrei invece che parte quando schiaccio il bottone e termina al termine del mio metodo.

    Grazie in anticipo per l'aiuto!
    Ciao
    Forse mancano pezzi di codice ma..
    Ma tu pensi che il backgroundWorker serva solo per creare l'animazione della barra?
    Deve essere il backgroundworker a svolgere il "metodo" in maniera asincrona. Proprio con il metodo "DoWork".
    http://www.pierotofy.it/pages/guide/...SystemWatcher/

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    6
    Quote Originariamente inviata da renygade Visualizza il messaggio
    Ciao
    Forse mancano pezzi di codice ma..
    Ma tu pensi che il backgroundWorker serva solo per creare l'animazione della barra?
    Deve essere il backgroundworker a svolgere il "metodo" in maniera asincrona. Proprio con il metodo "DoWork".
    http://www.pierotofy.it/pages/guide/...SystemWatcher/
    si so che tutto viene svolto all'interno del doWork, infatti al suo interno faccio una specie di simulazione con il ciclo for.
    Ecco il resto del codice.
    quando metto all'interno del doWork la mia chiamata al vero metodo scrivendo:
    vm.MethodCommand.Execute(null);

    mi da un eccezione dicendomi che il thread è già occupato

    codice:
    public partial class ContentUserControl : UserControl
        {
            //connect the ModelView with the View
            #region Constructor
            private readonly SimulComponentViewModel _viewModel;
            public ContentUserControl(SimulationComponentViewModel viewModel)
            {
                InitializeComponent();
                this._viewModel = viewModel;
                this.DataContext = viewModel;
            }
            #endregion
            private void MethodButton_Click(object sender, RoutedEventArgs e)
            {
                SimulComponentViewModel vm = this.DataContext as SimulComponentViewModel;
                if (vm != null)
                {
                    BackgroundWorker bgw = new BackgroundWorker();
                    bgw.WorkerReportsProgress = true;
                    bgw.DoWork += bgw_DoWork;
                    bgw.ProgressChanged += bgw_ProgressChanged;
                    bgw.RunWorkerAsync();
    
                    vm.MethodCommand.Execute(null);
                }
            }
            private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                //TextBoxControll.Value = e.ProgressPercentage;
                TextBoxControll.IsEnabled = true;
                TextBoxControll.Text = e.ProgressPercentage.ToString() + " %";
            }
            private void bgw_DoWork(object sender, DoWorkEventArgs e)
            {
                for (int i = 0; i <= 100; i++)
                {
                    (sender as BackgroundWorker).ReportProgress(i);
                    Thread.Sleep(25);
                }
            }
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da bugino Visualizza il messaggio
    si so che tutto viene svolto all'interno del doWork, infatti al suo interno faccio una specie di simulazione con il ciclo for.
    Ecco il resto del codice.
    quando metto all'interno del doWork la mia chiamata al vero metodo scrivendo:
    vm.MethodCommand.Execute(null);

    mi da un eccezione dicendomi che il thread è già occupato

    codice:
    public partial class ContentUserControl : UserControl
        {
            //connect the ModelView with the View
            #region Constructor
            private readonly SimulComponentViewModel _viewModel;
            public ContentUserControl(SimulationComponentViewModel viewModel)
            {
                InitializeComponent();
                this._viewModel = viewModel;
                this.DataContext = viewModel;
            }
            #endregion
            private void MethodButton_Click(object sender, RoutedEventArgs e)
            {
                SimulComponentViewModel vm = this.DataContext as SimulComponentViewModel;
                if (vm != null)
                {
                    BackgroundWorker bgw = new BackgroundWorker();
                    bgw.WorkerReportsProgress = true;
                    bgw.DoWork += bgw_DoWork;
                    bgw.ProgressChanged += bgw_ProgressChanged;
                    bgw.RunWorkerAsync();
    
                    vm.MethodCommand.Execute(null);
                }
            }
            private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                //TextBoxControll.Value = e.ProgressPercentage;
                TextBoxControll.IsEnabled = true;
                TextBoxControll.Text = e.ProgressPercentage.ToString() + " %";
            }
            private void bgw_DoWork(object sender, DoWorkEventArgs e)
            {
                for (int i = 0; i <= 100; i++)
                {
                    (sender as BackgroundWorker).ReportProgress(i);
                    Thread.Sleep(25);
                }
            }
    }
    Ma ti da un errore di cross-threading?
    Se hai messo il metodo "corretto", quello cioè di esecuzione lunga da far fare al thread asincrono, posta il codice del metodo doWork corretto. Ma poi..
    codice:
    vm.MethodCommand.Execute(null);
    Cosa fa esattamente? Query su database?
    Devi postare anche quel codice, altrimenti come facciamo a capire qual'è l'errore..

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    6
    Quote Originariamente inviata da renygade Visualizza il messaggio
    Ma ti da un errore di cross-threading?
    Se hai messo il metodo "corretto", quello cioè di esecuzione lunga da far fare al thread asincrono, posta il codice del metodo doWork corretto. Ma poi..
    codice:
    vm.MethodCommand.Execute(null);
    Cosa fa esattamente? Query su database?
    Devi postare anche quel codice, altrimenti come facciamo a capire qual'è l'errore..
    in pratica con il metodo vm.FormulaPizzaCommand.Execute(null); entro nel mio ViewModel
    dove gestisco il comando del bottone della mia GUI
    codice:
    #region Constructor
            public SimulatViewModel(SimulatModel model)
            {
                this._model = model;
                this.FormulaCommand = new RelayCommand(this.Formula);
            }
    
    public RelayCommand FormulaCommand { get; set; }
    
    private void Formula()
    {
                    string FormulaNumber = "1001";
                    if (!_model.ExistsFormula(FormulaNumber))
                    {
                        _model.InsertImage();
    }
    in pratica scrivo un immagine nel db e l'assegno alla formula

    l'errore è thread già in uso impossibile accedere

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 © 2025 vBulletin Solutions, Inc. All rights reserved.