Invoke på Control er en implementering af ISynchronizeInvoke.Invoke. Så hvis du vil ha' "invoke, begin/endInvoke" sovosv.. funktionalitet på din egenklasse må du implementere ISynchronizeInvoke interfacet.
Men det er nok ikke det du vil... :) Har du noget kode der deadlock'er ? måske skal du indføre noget trådsikkerhed?
Metode1 er den der skal tegne ting på min winform. Metode2 udfører en bunke beregninger der tager noget tid at udfører - det er her jeg har brug for at Invoke Metode1 - for at lade Metode1 fortælle lidt om hvor langt Metode2 er nået :-)
Metode2 ligger imidlertid i en klasse der ikke nedarver fra noget - og jeg savner her at kunne bruge Invoke()
Jeg har, som en midlertidig løsning, ladet Metode1 sørge for at invoke sig selv hvis det er nødvendigt - men jeg syntes ikke at det er en speciel køn løsning.
Håber det kastede lidt mere lys over problematikken.
Klassen, Metode2 ligger i, kunne have nogle events som blev raised når der sker noget, Metode1 skal have info om. Så kan første klasse lytte på disse events.
det var også en mulighed ja - men jeg syntes ikke at den er helt optimal heller. Jeg vil meget hellere lade klassen metode2 ligger i, håndtere delen med at invoke.
[metode2 i class2 kalder metode1 i Form1] setup: lav et nyt "windows application" projekt. tilføj en progressbar og en knap. Knappens OnClick handler:
private void button1_Click(object sender, System.EventArgs e) { OtherClass stuff = new OtherClass(); stuff.ProgressEvent += new ProgressDelegate(Method1);
Thread t = new Thread(new ThreadStart(stuff.Method2)); t.Start(); }
derudover en metode der bruges til at opdatere progressbaren (metode1) public void Method1(object sender, ProgressEventArgs e) { double val = progressBar1.Minimum; val += e.Progress*(progressBar1.Maximum-progressBar1.Minimum); progressBar1.Value = (int)val; }
definition af delegate, event og class2 hvori metode2 findes: public delegate void ProgressDelegate(object sender, ProgressEventArgs e);
// This class is used by ProgressDelegate public class ProgressEventArgs { double progress = 0;
public ProgressEventArgs(double progress) { this.progress = progress; }
public double Progress { get { return progress; } set { progress = value; } } }
public class OtherClass { // Progress event public event ProgressDelegate ProgressEvent;
public void Method2() { double d; for(int i=0; i<1000; i++) { d = 0; for(int j=0; j<1000000; j++) { d = d + 0.1; } // Makes good sense to notify here if(ProgressEvent != null) { ProgressEvent(this, new ProgressEventArgs(i/1000.0)); } }
Sovsekoder: Jeg kan ikke lige lure hvordan det klarer thread problemet. Men jeg prøver det ad i løbet af ugen - er ikke lige i nærheden af vs.net de næste par dage :-(
har måske misforstået din problematik. Den kode jeg har posted gør følgende:
class1 opretter en tråd hvor class2.metode2 kører. Metode2 sender events til metode1 for at opdatere gui.
Synes godt om
Ny brugerNybegynder
Din løsning...
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.