Frage : Multithreading in C# .NET

Ich bin zur Softwareentwicklung in .NET verhältnismäßig neu, und ich wünsche multithreading in meiner Anwendung pflegen, um zu verhindern, dass das GUI einfriert, während eine Methode mit einer langen Fallmethode der DB-Frage executes.
My ein Fallfeld einstellt, das nicht bezogen werden sollte, bis die Fallmethode komplett ist.  Wie kann ich dies tun?

Attached ist irgendein Code zum demostrate, was ich tue:



I erhielt bis zu dem Ersetzen:

myObject1.queryRecent ();

With:

Thread secondThread = neues Gewinde (neues ThreadStart (myObject1.queryRecent));
secondThread.Start ();

But offensichtlich, label1.Text = myObject1.recentString;  wird durchgeführt, während die Methode noch running.

How kann ich diese durchführende Linie verhindern ist, bis die queryRecent Methode die Durchführung beendet hat?

Thanks im Voraus,
Matt
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:
6:
37:
38:
39:
40:
41:
42:
public teilweise Kategorie Form1: Form
{
   Class1 myObject1 = neues Class1 ();
   Öffentlichkeit Form1 ()
   {
       InitializeComponent ();
   }

   private Lücke textBox1_KeyPress (Gegenstandabsender, KeyPressEventArgs e)
   {
       wenn (e.KeyChar == 13)
       {
           myObject1.myString = textBox1.Text;

           //Run dieses Gewinde der Methode sofort, also das GUI friert nicht ein, während es durchführt:
           myObject1.queryRecent ();

           //Don ' t führen durch, bis myObject1.queryRecent komplett ist
           label1.Text = myObject1.recentString;
}}}


Kategorie Class1
{
    allgemeine Schnur, die = „myString Initiale“ myString ist;     //set außen
    allgemeine Schnur, die = „recentString Initiale“ recentString ist;	//set durch das queryString
    allgemeine Schnur, die = „allString Initiale“ allString ist;    //set durch queryAll

    Öffentlichkeit leere queryRecent ()
    {
        //simulate eine lange Datenbankfrage:
        Thread.Sleep (3000);  
        recentString = myString + „. Mehr Text“;
    }

    Öffentlichkeit leeres queryAll ()
    {
         //simulate eine lange Datenbankfrage:
         Thread.Sleep (5000); 
         allString = myString + „. Etwas anderer Text“;
    } 
}

Antwort : Multithreading in C# .NET

Sie können ein BackgroundWorker () so verwenden:
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:
6:
37:
38:
39:
40:
    allgemeine teilweise Kategorie Form1: Form
    {

        privates System.ComponentModel.BackgroundWorker bgw = Null;
        privates Class1 myObject1 = neues Class1 ();

        Öffentlichkeit Form1 ()
        {
            InitializeComponent ();
        }

        private Lücke textBox1_KeyPress (Gegenstandabsender, KeyPressEventArgs e)
        {
            wenn (bgw == Null)
            {
                bgw = neues BackgroundWorker ();
                bgw.DoWork += neues DoWorkEventHandler (bgw_DoWork);
                bgw.RunWorkerCompleted += neues RunWorkerCompletedEventHandler (bgw_RunWorkerCompleted);
            }

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

        leeres bgw_DoWork (Gegenstandabsender, DoWorkEventArgs e)
        {
            myObject1.queryRecent ();
        }

        Lücke bgw_RunWorkerCompleted (Gegenstandabsender, RunWorkerCompletedEventArgs e)
        {
            label1.Text = myObject1.recentString;
            textBox1.Enabled = richten aus;
        }

    }
Weitere Lösungen  
 
programming4us programming4us