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

Problem z ładaowaniem preloadera.Wielowątkowosć. C# wpf - pilne!!!!
PP
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:5
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:

Kopiuj
 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

edytowany 2x, ostatnio: somekind
T2
  • Rejestracja:prawie 11 lat
  • Ostatnio:9 miesięcy
  • Postów:194
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.

PP
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:5
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???

mr-owl
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad rok
  • Postów:206
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

PP
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:5
0

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

mr-owl
"Programista_pocztkujacy" - to tak celowo czy literówka?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.