Toon posts:

[C#/Forms] BackGroundWorker_Update

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste mede Tweakers,

Ik zit hier met een probleempje (uiteraard) waarvan ik me afvraag of er een oplossing mogelijk is..

Ik heb een Windows Form applicatie waarin ik een BackGroundWorker heb. Nou is dit de eerste keer dat ik hiermee ga werken en ben nog een beetje aan het spelen hiermee. Het is de bedoeling dat de BackGroundWorker_Update mijn progressBar1 netjes blijft Updaten. Dit doet hij ook en ik begrijp ook hoe het werkt.

Nou heb ik alleen een Method met daarin 2 foreach loops... in de 2e foreach loop roept de Method zichzelf nogmaals aan... zoals hier:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void CopyFolder(string Source, string Destination, bool Overwrite)
        {
            string[] files = Directory.GetFiles(source);
            string[] folders = Directory.GetDirectories(source);

            foreach (string file in files)
            {
                // Hier zou ik graag een Worker.Update() willen doen
                // Ik heb namelijk nog een TotalFilesInSource function die ProgressBar.Maximum bepaalt
                // Zo kan ik per file een backGroundWorker.Update() doen

                string fileName = Path.GetFileName(file);
                string newFile = Path.Combine(destination, fileName);
                System.IO.File.Copy(file, newFile, overwrite);
            }

            foreach (string folder in folders)
            {
                string folderName = Path.GetFileName(folder);
                string newFolder = Path.Combine(destination, folderName);

                System.IO.Directory.CreateDirectory(newFolder);
                
                CopyFolder(folder, newFolder, Overwrite);
            }
        }


Is er iets om dit anders te doen, ik wil dus die foreach loop (allebei) in mijn Worker_DoWork event zetten maar dit kan dus niet omdat deze method zichzelf vaker aanroept omdat het Source path vaker veranderd.\

Is er manier om te verhelpen? een duwtje in de goede richting zou al super zijn :D

alvast bedankt,

Vincent

[ Voor 4% gewijzigd door Verwijderd op 15-01-2009 11:34 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23-09 23:37

Janoz

Moderator Devschuur®

!litemod

Ik vind je vraag niet helemaal duidelijk, maar bedoel je dat je niet kunt bepalen wat het totaal aantal files is dat je tot nu toe al gedaan hebt?

Wat je in dat geval zou kunnen doen is een extra parameter meegeven waarin je aangeeft hoeveel bestanden er tot nu toe al gekopieerd zijn (alleen te gebruiken in de update van de progressbar) en binnen de methode zelf een teller bijhouden hoeveel bestanden je al gekopieerd hebt en dit als return waarde terug geven.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Je kan de recursieve procedure omvormen naar een iteratieve door een Queue te gebruiken bijvoorbeeld. Dan Enqueue je alle files op de Queue die je vindt, en daarna blijf je van de Queue dequeuen tot ie leeg is, de progress is dan gewoon de positie in de Queue tov. de lengte van de Queue.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bedankt voor jullie snelle reacties,

ik zal me vraag/probleem nog wat beter omschrijven.

Ik heb een Method genaamd: CopyFolder, deze wil ik graag gebruiken in mijn BackGroundWorker_DoWork() Event. zoals hier:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
private string source = "";
private string destination = "";
private bool overWrite = true;

private void CopyFolder(string Source, string Destination, bool Overwrite)
{
            string[] files = Directory.GetFiles(source);
            string[] folders = Directory.GetDirectories(source);

            foreach (string file in files)
            {
                // Hier zou ik graag een Worker.Update() willen doen
                // Ik heb namelijk nog een TotalFilesInSource function die ProgressBar.Maximum bepaalt
                // Zo kan ik per file een backGroundWorker.Update() doen

                string fileName = Path.GetFileName(file);
                string newFile = Path.Combine(destination, fileName);
                System.IO.File.Copy(file, newFile, overwrite);
            }

            foreach (string folder in folders)
            {
                string folderName = Path.GetFileName(folder);
                string newFolder = Path.Combine(destination, folderName);

                System.IO.Directory.CreateDirectory(newFolder);
                
                CopyFolder(folder, newFolder, Overwrite);
            } 
}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
      BackgroundWorker worker = (BackgroundWorker)sender;
      CopyFolder(source, destination, overWrite);
}

 private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
      this.progressBar1.Value = this.progressBar1.Value + e.ProgressPercentage;
      this.label1.Text = e.UserState as string;
}


Ik zou nou willen weten of het dus mogelijk is om vanuit mijn Method de backGroundWorker_ProgressChanged() aan te roepen, omdat ik namelijk anders geen _ProgressChanged() a kan aanroepen. Dit kan wel als ik de body uit mijn Method in de BackGroundWorker_DoWork copieër maar dan klopt die 2e loop niet meer omdat ik hiervan steeds de Source aan pas

...denk dat ik te moeilijk ben aan het zoeken op dit moment (en gister)

nogmaals alvast bedankt ;)

[ Voor 5% gewijzigd door Verwijderd op 15-01-2009 15:35 ]