Vraag : Multithreading in C# .NET

Ik ben vrij nieuw aan softwareontwikkeling in .NET, en ik wil multithreading in mijn toepassing gebruiken om GUI te verhinderen te bevriezen terwijl een methode met een lange methode van de de vraagexecutes.
My instantie van OB een instantiegebied plaatst dat niet zou moeten worden van verwijzingen voorzien tot de instantiemethode volledig is.  Hoe kan ik dit doen?

Attached is één of andere code aan demostrate wat ik doe:



I kreeg zover als het vervangen:

myObject1.queryRecent ();

With:

Thread secondThread = nieuwe Draad (nieuwe ThreadStart (myObject1.queryRecent));
secondThread.Start ();

But duidelijk, label1.Text = myObject1.recentString;  wordt uitgevoerd terwijl de methode nog running.

How kan ik deze lijn verhinderen uitvoerend is tot de queryRecent methode het uitvoeren heeft gebeëindigd?

Thanks vooraf,
Matt
" codeBody "
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:
public gedeeltelijke klasse Form1: Vorm
{
   Class1 myObject1 = nieuwe Class1 ();
   openbare Form1 ()
   {
       InitializeComponent ();
   }

   privé nietige textBox1_KeyPress (objecten afzender, KeyPressEventArgs e)
   {
       als (e.KeyChar == 13)
       {
           myObject1.myString = textBox1.Text;

           //Run deze methode in een tweede draad, zodat GUI bevriezen niet terwijl het uitvoert:
           myObject1.queryRecent ();

           //Don ' t voert uit tot myObject1.queryRecent volledig is
           label1.Text = myObject1.recentString;
}}}


klasse Class1
{
    openbaar koord die = „het aanvankelijke myString“ myString;     //set uiterlijk
    openbaar koord die = „het aanvankelijke recentString“ recentString;	//set door queryString
    openbaar koord die = „het aanvankelijke allString“ allString;    //set door queryAll

    openbare nietige queryRecent ()
    {
        //simulate een lange gegevensbestandvraag:
        Thread.Sleep (3000);  
        het recentString = myString + „. Wat meer tekst“;
    }

    openbare nietige queryAll ()
    {
         //simulate een lange gegevensbestandvraag:
         Thread.Sleep (5000); 
         het allString = myString + „. Één of andere andere tekst“;
    } 
}

Antwoord : Multithreading in C# .NET

U kunt een BackgroundWorker () als dit gebruiken:
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:
    openbare gedeeltelijke klasse Form1: Vorm
    {

        privé System.ComponentModel.BackgroundWorker bgw = verklaren nietig;
        privé Class1 myObject1 = nieuwe Class1 ();

        openbare Form1 ()
        {
            InitializeComponent ();
        }

        privé nietige textBox1_KeyPress (objecten afzender, KeyPressEventArgs e)
        {
            als (bgw ongeldige ==)
            {
                bgw = nieuwe BackgroundWorker ();
                bgw.DoWork += nieuwe DoWorkEventHandler (bgw_DoWork);
                bgw.RunWorkerCompleted += nieuwe RunWorkerCompletedEventHandler (bgw_RunWorkerCompleted);
            }

            als (e.KeyChar == 13 &&! bgw.IsBusy)
            {
                textBox1.Enabled = vals;
                myObject1.myString = textBox1.Text;
                bgw.RunWorkerAsync ();
            }
        }

        nietige bgw_DoWork (objecten afzender, DoWorkEventArgs e)
        {
            myObject1.queryRecent ();
        }

        de leegte bgw_RunWorkerCompleted (objecten afzender, RunWorkerCompletedEventArgs e)
        {
            label1.Text = myObject1.recentString;
            textBox1.Enabled = waar;
        }

    }
Andere oplossingen  
 
programming4us programming4us