Archief - C# Eigen delegate aan Thread koppelen

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.

Recipe4hate

Legacy Member
Hoi allemaal,

Ik heb in C# een aparte Thread om een berekening te doen, terwijl de rest van mijn UI Thread blijft functioneren...

Deze Thread wordt momenteel zo gestart:
Code:
Thread processTIDRequestInBackground = new Thread(() => ExecuteQuery_LoadTIDSelection(StartDate, 
                                                                                      EndDate, 
                                                                                      Carrier));
processTIDRequestInBackground.Start();

Is het ook mogelijk om deze syntax (de lambda toch) te vervangen door een delegate?
Ik zoek iets in de aard van:
Code:
private delegate void processingDelegate(string x, string y, string z);
processingDelegate pDG = ExecuteQuery_LoadTIDSelection;
Thread processTIDRequestInBackground = new Thread(pDG, "X", "Y", "Z");
processTIDRequestInBackground.Start();

Zoals jullie wel weten, kan ik de functie niet direct koppelen aan de thread. Dit kan alleen als er slechts 1 parameter wordt meegegeven en in mijn geval zijn er 3 nodig.
Ook heb aanmaken van een nieuw object voor deze 3 parameters in te verzamelen vind ik een beetje omslachtig...

Alvast bedankt voor jullie hulp en inzicht!


Edit:
Dit werkt wel:
Code:
ThreadStart threadStart = delegate { ExecuteQuery_LoadTIDSelection("x", "y", "z"); };

Dit werkt niet (connect convert to threadstart...):
Code:
EQDG = ExecuteQuery_LoadTIDSelection;
ThreadStart start = (ThreadStart)EQDG;

pietje666

Legacy Member
Recipe4hate zei:
Hoi allemaal,

Ik heb in C# een aparte Thread om een berekening te doen, terwijl de rest van mijn UI Thread blijft functioneren...

Deze Thread wordt momenteel zo gestart:
Code:
Thread processTIDRequestInBackground = new Thread(() => ExecuteQuery_LoadTIDSelection(StartDate, 
                                                                                      EndDate, 
                                                                                      Carrier));
processTIDRequestInBackground.Start();

Is het ook mogelijk om deze syntax (de lambda toch) te vervangen door een delegate?
Ik zoek iets in de aard van:
Code:
private delegate void processingDelegate(string x, string y, string z);
processingDelegate pDG = ExecuteQuery_LoadTIDSelection;
Thread processTIDRequestInBackground = new Thread(pDG, "X", "Y", "Z");
processTIDRequestInBackground.Start();

Zoals jullie wel weten, kan ik de functie niet direct koppelen aan de thread. Dit kan alleen als er slechts 1 parameter wordt meegegeven en in mijn geval zijn er 3 nodig.
Ook heb aanmaken van een nieuw object voor deze 3 parameters in te verzamelen vind ik een beetje omslachtig...

Alvast bedankt voor jullie hulp en inzicht!


Edit:
Dit werkt wel:
Code:
ThreadStart threadStart = delegate { ExecuteQuery_LoadTIDSelection("x", "y", "z"); };

Dit werkt niet (connect convert to threadstart...):
Code:
EQDG = ExecuteQuery_LoadTIDSelection;
ThreadStart start = (ThreadStart)EQDG;

uw object probleem kunt ge voorkomen door de tuple class te gebruiken, dan moet je daar geen aparte klasse voor schrijven.(wel pas vanaf .net 4.0)

en ipv met een gewone thread zou ik met een backgroundworker werken die dient specifiek voor met je UI te werken. Gemakkelijker als je daarna nog een update van je ui wil doorvoeren. (parameters aan de hand van event arguments, moet je wel weer eigen klasse schrijven...)

Recipe4hate

Legacy Member
Maar ik zou ook graag willen weten wat het probleem nu eigenlijk is?
Ik weet dat () en delegate{} nameless delegates zijn, maar waarom mag ik daar geen gewone delegate gebruiken?
Is het omdat mijn delegate een signature heeft die er niet hoort?

pietje666

Legacy Member
Recipe4hate zei:
Maar ik zou ook graag willen weten wat het probleem nu eigenlijk is?
Ik weet dat () en delegate{} nameless delegates zijn, maar waarom mag ik daar geen gewone delegate gebruiken?
Is het omdat mijn delegate een signature heeft die er niet hoort?

wat je zelf zegt :), als je gaat kijken naar de constructors van de Thread klasse zie je dat je 2 verschillende delegates kan meegeven van het type met signatuur

=> public delegate void ParameterizedThreadStart(Object obj)
of
=> public delegate void ThreadStart()

dus oftewel geef je een object mee als parameter oftewel niets. Return is altijd void.

Recipe4hate

Legacy Member
Dat begrijp ik ja, en dus de nameless delegate die ik doorgeef, refereert wel naar een method met parameters.
Kan ik dit ook doorgegeven op een niet-shorthand manier?
Ik begrijp dat de delegate die ik zelf aanmaak een signature met parameters is, maar ik denk niet dat ik dit op deze manier kan omzeilen?

pietje666

Legacy Member
Recipe4hate zei:
Dat begrijp ik ja, en dus de nameless delegate die ik doorgeef, refereert wel naar een method met parameters.
Kan ik dit ook doorgegeven op een niet-shorthand manier?
Ik begrijp dat de delegate die ik zelf aanmaak een signature met parameters is, maar ik denk niet dat ik dit op deze manier kan omzeilen?

wat bedoelde met niet shorthand manier?

ge kunt altijd uw delegate voluit schrijven als een delegate die geen parameters meeneemt en dan verwijst naar een methode waarin uw methode met parameters wordt uitgevoerd.

Nu het punt van die delegates is vooral als je de start methode aanroept hé, daarom dat je object kan meegeven. Als je dan thread.start( objectparam) doet dat je die objectparameter kan meegeven.

En om geen nieuwe klasse aan te maken => werken met tupple class


btw ipv threading class kan je tegenwoordig ook beter de Task class gebruiken die wat beter met threads omspringt echter blijf je wel bij dezelfde beperking van uw parameter gedoe als ik het goed heb
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