Betyder at det er den der eger tråden som kommer til at udføre den Method, som skriver det i din label, da det ikke er lovligt at udføre GUI ting, hvis den thread som kører ikke selv ejer GUI-delen, derfor bruger man Invoke til at få den ejende tråd til at udføre der..... Derfor er koden også lavet sådan at der bliver spurgt om det er nødvendigt at der bliver kaldt Invoke... if (this.InvokeRequired) Hvis ikke, så skriver den bare, ellers udføre den det andet som gør at det er den der ejer GUI tråden som udføre processsen.......
Det smarte ved at gøre det på den her måde, er at det kun kræver 1 method, da man genbruger metoden, med this.InvokeRequired....
Håber det giver mening, og at det er korrekt... :-) Jeg er næsten sikker, men ikke 100%....
Super sommervejr btw :-)
Svar, hvis det kan bruges.... da jeg drager ud i varmen, græsset slår jo ikke sig selv :-P // ouT
1. => OutputMessageDelegate omd = new OutputMessageDelegate(OutputMessage);
her oprettes en instans af en "outputMessageDelegate". Dette er i princippet en funktions-pointer. Man kan altså identificere funktionen "OutputMessage" vha. variablen "omd".
2. IAsyncResult arx = this.BeginInvoke(omd, new object[] { msg }); this referer til din form. Når man kalder BeginInvoke(...) ell. Invoke(...) finder implementeringen den tråd der bruges af formen (vha. af det handle der identificerer formen unikt). Denne tråd bliver derefter bedt om at kalde din delegate ("omd"). Omd var jo vores funktionspointer som peger på OutputMessage. Så man beder altså formens tråd om at eksikvere metoden OutputMessage.
3. this.EndInvoke(arx); Denne metode venter på at metode kaldet til OutputMessage er afsluttet.
funktions-pointer betyder det bare, at den peger på en (eller flere) metode(r)?
2.
okay så nu står der "this.beginInvoke" fordi det er noget som kører i tråden main? har nemlig set hvor man f.eks skriver navnet på en delegate og ikke this.
altså dette eksempel
static void Main(string[] args) { ... BinaryOp b = new BinaryOp(Add); IAsyncResult iftAR = b.BeginInvoke(iftAR);
Console.WriteLine("Doing more work in Main()!");
int answer = b.EndInvoke(iftAR); ... }
Der er så denne delegate
public delegate int BinaryOp(int x, int y);
og denne metode
static int Add(int x, int y) { //Pause to simulate a lengthy operation Thread.Sleep(5000); return x + y; }
jeg har måtte skære lidt fra, men mit spørgsmål er hvorfor man skriver beginInvoke på den der delegate?
Burde have forstået det når jeg lige får en forklaring på det:)
3.
this.EndInvoke(arx); behøver man at kalde denne hvis ens metode ikke returnere noget?
4.
return; hmm.. hvad gør den? når jeg fjerner den virker alting stadig synes jeg.
du må også gerne ligge et svar i dit næste indlæg tak
>jeg undrer mig stadig over return; return afslutter hopper ud af metoden. - så når .NET runtime engine møder return så eksekveres der ikke mere kode i den metode! Dette betyder så at label6.Text = "Your turn"; ikke køres. Jeg ville forvente at du får en exception når du fjerner return. Hvis return fjernes vil label6.Text = "blah"; blive udført, hvilket ikke er tilladt hvis ikke det gøres fra GUItråden.
>hvorfor ser den ikke sådan ud Metoden BeginInvoke tager 2 parametre: en delegate og et array af objects. Det er dette array der indeholder paramtrene til din delegate. I dit tilfælde tager din delegate 1 parameter som string. Med andre ord skal man give BeginInvoke et object-array med eet element, nemlig den string der skal gives som parameter: derfor:
this.BeginInvoke(dinDelegate, new object[] { dinDelegateParameter1 });
grunden til at det er et array af objects er: På denne måde kan man konstruere alle tænke lige metodekald. Hvis beginInvoke blot tog en "string" som parameter, ville man begrænse mulighederne for forskellige parametre, da man kun kan angive en string :o (det kunne jo være det skulle være en integer i nogle tilfælde :)).
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.