Archief - C# - BackgroundWorker

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

InFerNo

Legacy Member
Hallo

Even kort uitleggen, ik heb volgend stukje code staan maar de backgroundworker wilt dit niet uitvoeren, zo lijkt mij:

Bovenaan binnen de class staat
Code:
static BackgroundWorker bw = new BackgroundWorker();

Dan staat binnen void Main()
Code:
bw.RunWorkerAsync(strWgetParameter);

//CallWget(strWgetParameter);

En dan is er nog de bw_DoWork()
Code:
static void bw_DoWork (object sender, DoWorkEventArgs e) 
{		
      CallWget(e.Argument.ToString()); // Perform time-consuming task...
}

Ik heb de CallWget(); er commented bijgezet ter info hier, want als ik de comments weg doen, dan voert hij CallWget(); wel correct uit.
Ik heb breekpunten gezet in de verschillende voids en hij gaat wel over RunWorkerAsync, maar dat is het dan ook. Hij passeert er wel (wat ook logisch is aangezien die CallWget(); er achter ook functioneert als ik de comments weg doe.

Iemand een idee?

Moto

Legacy Member
effe een domme opmerking heh

bw.DoWork += bw_DoWork;

staat er toch ook ergens ?

InFerNo

Legacy Member
Ja, vlak voor bw.RunWorkerAsync(strWgetParameter);

edit:

Beetje meer code

Code:
{
   strWgetParameter = "-c http://testurl"; //TODO: put the parameter here that wget needs to recursively download files
	
   bw.DoWork += bw_DoWork;
   bw.RunWorkerAsync(strWgetParameter); //This will start a task in the background (running wget -c over and over and over again)
   //CallWget(strWgetParameter);
										
}

Moto

Legacy Member
Tja moeten die dingen eigenlijk wel static zijn?
Toch ook zeker dat hem geen exceptions throwed?

die e.Argument.ToString() zou normaal moeten kloppen, ander die ook effe hardcoden

InFerNo

Legacy Member
Ik zal zeggen dat ik het van een site gekopïeerd heb en enkel wat 'parameters' heb aangepast zodat het voor mij past :p

Als ik die void niet static maak: An object reference is required for the non-static field, method, or property 'wgetlauncher.Program.bw_DoWork(object, System.ComponentModel.DoWorkEventArgs)' (CS0120)

Voorlopig try catch ik geen exceptions in die CallWget(); dus moet dit toch tonen, right?

edit: die e.Argument hardcoden doet ook niets :(

Het zit volgens mij toch wel hier ergens, hij gaat er tenslotte over maar 't lijkt alsof hij het niet uitvoert..

bw.RunWorkerAsync(strWgetParameter);


edit2: ik heb ook al geprobeerd om de declaratie en initialisatie van bw vlak voor de bw.DoWork =+ bw_DoWork; te zetten
Code compiled en runt maar hetzelfde probleem

Moto

Legacy Member
CallWget() is ook static?
Misschiens nog eens vergelijken met de gekopieerde code :p

Mee

Legacy Member
Zet in uw BackgroundWorker eens een stukje code waarvan je zeker het resultaat kan zien, zoals bv een file die wordt aangemaakt. Ik heb het zelf nog niet gebruikt, maar misschien breakt Visual Studio daar niet op juist omdat het een background-ding is?

InFerNo

Legacy Member
Mee zei:
Zet in uw BackgroundWorker eens een stukje code waarvan je zeker het resultaat kan zien, zoals bv een file die wordt aangemaakt. Ik heb het zelf nog niet gebruikt, maar misschien breakt Visual Studio daar niet op juist omdat het een background-ding is?

CallWget() download een file van een server.

Ik test het programma nu met een foto van 1.3Mb op mijn webspace, als ik CallWget() aanroep dan download hij de foto netjes, maar de background worker doet _DoWork niet, en daar staat alleen maar CallWget() in.


Als ik CallWget() buiten de background worker aanroep (vlak voor en/of vlak na de RunWorkerAsync, dan voert hij de code wél correct uit.

Tyfius

Legacy Member
Wacht uw applicatie ergens tot als die background worker de tijd heeft gehad om uit te voeren, of stopt uw applicatie na het aanroepen van RunWorkerAsync()?

jeroen65

Legacy Member
Zou ook mijn gok zijn. Je doet toch iets in jouw work completed? en normaal kan je een breekpunt zetten in jouw do-work hoor. (gaat toch in vb.net). En anders zet je een breekpunt in jouw work completed en kijkt eens in het "e" argument van die functie. in .errors kan er een exception zitten.

InFerNo

Legacy Member
Tyfius zei:
Wacht uw applicatie ergens tot als die background worker de tijd heeft gehad om uit te voeren, of stopt uw applicatie na het aanroepen van RunWorkerAsync()?

Tja, het stop eigenlijk na die async, ik neem als de async bezig is dat het programma dan niet afsluit, ik heb begrepen dat die work-completed optioneel was?

Wat kan ik hier best nog zetten dan?

Tyfius

Legacy Member
Een oplossing die ik snel kan bedenken is ergens een while loop met een Thread.Sleep() ergens zetten. Ik weet eigenlijk niet of er direct betere oplossingen zijn.

Klein voorbeeldje:
Code:
namespace BackgroundTest
{
	internal class Program
	{
		private bool m_isCompleted;

		public void Process()
		{
			StartBackgroundWorker();

			Console.WriteLine("Got here");

			while (!m_isCompleted)
			{
				Thread.Sleep(50);
			}

			Console.WriteLine("Completed");
		}

		private void StartBackgroundWorker()
		{
			BackgroundWorker bw = new BackgroundWorker();
			bw.DoWork += (sender, args) =>
			{
				for (int i = 0; i < int.MaxValue; i++)
				{
					if ((i % 1000000000) == 0)
					{
						Console.WriteLine(i);
					}
				}

				m_isCompleted = true;
			};

			bw.RunWorkerAsync();
		}


		private static void Main()
		{
			Program p = new Program();
			p.Process();

			Console.ReadKey();
		}
	}
}
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan