Problem z ładaowaniem preloadera.Wielowątkowosć. C# wpf - pilne!!!!

0

Witam,
jestem początkującym programistą i nie mam doświadczenia w programowaniu wielowątkowym. Pracuję nad aplikacja wpf, w której po wyborze pliku (shapefile) w oknie dialogowym , wykonywana jest metoda OpenFile(file) i następuje dość długi proces przetwarzania i ładowania pliku. Chciałbum, aby w tym czasie widoczny był animowany preloader, który umiśeciłem w oknie popup, stworzonym w głównym oknie aplikacji. Napisałem kod:

 ppublic partial class MainWindow : Window
    {
        BackgroundWorker worker = new BackgroundWorker();

     
        public MainWindow()
        {
            InitializeComponent();

}

 private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
          mojpopup.Dispatcher.Invoke(() => { mojpopup.IsOpen = true; });
            
        }
        private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
        //mojpopup.Dispatcher.Invoke(() => { mojpopup.IsOpen = false; });
        }

public void OpenShapeFile(string path)
        {    
         
            worker.WorkerReportsProgress = true;
            worker.DoWork += worker_DoWork;

             worker.RunWorkerAsync();
            // metody otwierające plik

         worker.RunWorkerCompleted += worker_RunWorkerCompleted;
           

}

}

Niestety popup pojawia się dopiero po załadawaniu pliku i nie wiem, dlaczego tak sie dzieje. Bardzo prosze o pomoc

0

Cześć,

Popraw formatowanie bo kiepsko się czyta.
Pierwszy status ustawiasz w metodzie: OpenShapeFile , ponieważ cały czas jesteś na wątku UI. W tle odpalasz długi process.
Drugi status ustawiasz dopiero w metodzie worker_RunWorkerCompleted, ponieważ jesteś znów w wątku UI.

W obu wypadkach nie używasz mojpopup.Dispatcher.Invoke, jest to zbędne. Po prostu odwołanie do kontrolki + property.

0

Dzięki wielkie za wskazówki. Problem polega na tym, że długi proces to metoda otwierania pliku (shapefile) i ładowania do wyświetlającej go kontrolki- więc wyskakuje mi wyjątek. Można jakoś odpalić kontrolkę w wątku drugim???

0
Programista_pocztkujacy napisał(a):

Dzięki wielkie za wskazówki. Problem polega na tym, że długi proces to metoda otwierania pliku (shapefile) i ładowania do wyświetlającej go kontrolki- więc wyskakuje mi wyjątek. Można jakoś odpalić kontrolkę w wątku drugim???

Witam,

Może zobacz czy ten przykład Ci się przyda: https://github.com/gajda-ltd/FourProgrammersDotNetExamples/tree/master/WpfMvvmBackgroundWorker

Pozdrawiam,

mr-owl

0

Dzięki wielkie. Udało mi się zrobić:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1