Fråga : Multithreading i C# .NET

Förmiddag som I förhållandevis är ny till programvaruutveckling i .NET och I-förmiddagen som önskar att använda multithreading i min applikation för att förhindra GUIEN från att frysa, fördriver en metod med en lång DB-query executes.
My anföra som exempel metoduppsättningar som en anföra som exempel sätter in, som inte bör hänvisas till, tills anföra som exempelmetoden är färdig.  Hur kan jag göra denna?

Attached är någon kodifierar till demostrate vad göra för I-förmiddag:



I som fås som så är avlägsen som byta ut:

myObject1.queryRecent ();

With: secondThread för

Thread = ny tråd (nya ThreadStart (myObject1.queryRecent));
secondThread.Start ();

But självfallet, label1.Text = myObject1.recentString;  är den de utförda stunden metoden är stilla running.

How kan mig förhindra detta fodrar utförande, tills den queryRecent metoden har avslutat utförande?

Thanks i förskott,
Matt
> för
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:
" codeBody " partiskt för class= för public " klassificerar Form1: Bilda { Class1 myObject1 = ny Class1 (); offentliga Form1 () { InitializeComponent (); } privat utan laga kraft textBox1_KeyPress (anmärka avsändaren, KeyPressEventArgs e), { om (e.KeyChar-== 13) { myObject1.myString = textBox1.Text; //Run denna metod i en understödjatråd, så GUIEN fryser inte stunder som den utför: myObject1.queryRecent (); //Don ' t utför, tills myObject1.queryRecent är färdig label1.Text = myObject1.recentString; }}} klassificera Class1 { allmänhet stränger myString = ”initial myString”; //set externt allmänhet stränger recentString = ”initial recentString”; //set, vid queryString allmänhet stränger allString = ”initial allString”; //set vid queryAll offentliga utan laga kraft queryRecent () { //simulate en lång databasquery: Thread.Sleep (3000); recentString = myString + ”. Någon mer text”; } offentlig utan laga kraft queryAll () { //simulate en lång databasquery: Thread.Sleep (5000); allString = myString + ”. Någon annan text”; } }
" klar "

Svar : Multithreading i C# .NET

Du kan använda en BackgroundWorker () något liknande detta:
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:
    offentligt partiskt klassificerar Form1: Bilda
    {

        privat System.ComponentModel.BackgroundWorker-bgw = ogiltigt;
        privat Class1 myObject1 = ny Class1 ();

        offentliga Form1 ()
        {
            InitializeComponent ();
        }

        privat utan laga kraft textBox1_KeyPress (anmärka avsändaren, KeyPressEventArgs e),
        {
            om (ogiltig bgw==)
            {
                bgw = nya BackgroundWorker ();
                bgw.DoWork += nya DoWorkEventHandler (bgw_DoWork);
                bgw.RunWorkerCompleted += (bgw_RunWorkerCompleted) nya RunWorkerCompletedEventHandler;
            }

            om (&& för e.KeyChar-== 13! bgw.IsBusy)
            {
                textBox1.Enabled = falskt;
                myObject1.myString = textBox1.Text;
                bgw.RunWorkerAsync ();
            }
        }

        utan laga kraft bgw_DoWork (anmärka avsändaren, DoWorkEventArgs e),
        {
            myObject1.queryRecent ();
        }

        bgw_RunWorkerCompleted utan laga kraft (anmärka avsändaren, RunWorkerCompletedEventArgs e),
        {
            label1.Text = myObject1.recentString;
            textBox1.Enabled = true;
        }

    }
Andra lösningar  
 
programming4us programming4us