Entwickler-Ecke

Sonstiges (.NET) - Drei Methode parallel laufen lassen


doubleII - Fr 21.04.17 14:44
Titel: Drei Methode parallel laufen lassen
Hallo zusammen,

welcher ist der beste Weg mehr Methoden parallel laufen zu lassen?

C#-Quelltext
1:
task t = Task.Run(() => {}); t.Wait();                    

oder

C#-Quelltext
1:
Parallel.Invoke(() => );                    


Es muss auf die Bildübertragung von Kamera gewartet werden.


C#-Quelltext
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:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
        private void G2Snap()
        {
            int result1 = 0;
            int result2 = 0;
            int result3 = 0;
       
            // master camera start acquisiton time
            result3 = Driver.IGrab2.G2Grab(camera[0]);
            // Slave camera 1 start axquisition time
            result2 = Driver.IGrab2.G2Grab(camera[1]);
            // Slave camera 2 start acquisition time
            result1 = Driver.IGrab2.G2Grab(camera[2]);
            
            
            // trigger signal master camera 
            Driver.ISoftwareTrigger.STTrigger(camera[0], 0);
            
           //##################################################
           // start die drei Wait Methoden mit Task
           Task t1 = new Task.Run(() => {
            // wait for the next image from the master cam
            Driver.IGrab2.G2Wait(camera[0]);
            }); t1.Start();

            Task t2 = new Task.Run(() =>
            {
            // wait for the next image from the slave cam1
            Driver.IGrab2.G2Wait(camera[1]);
            }; t2.Start();

            Task t3 = new Task(() => 
            {
            // wait for the next image from the slave cam2
            Driver.IGrab2.G2Wait(camera[2]); 
            } t3.Start;
          
// warte so lange bis die Bilder übertragen werden 
            t1.Wait();
            t2.Wait();
            t3.Wait();
             
            //##################################################

            // start die drei Wait Methodne mit Paralel.Invoke
            Parallel.Invoke(() =>
              Driver.IGrab2.G2Wait(camera[0]),() => 
              Driver.IGrab2.G2Wait(camera[1]) () =>
              Driver.IGrab2.G2Wait(camera[0]));
           //##################################################

            //Show if error
            ShowError(result3, result2, result1);           
        }

        /// <summary>
        /// Stop acquisition time
        /// </summary>
        private void FreezeCamera()
        {
            for (int i = 0; i <= (camera.Length - 1); i++)
            {
                // IMG image[i], bildaufnahme stop = true
                // look if SharedImg is the same like IMG ???
                Driver.IGrab2.G2Freeze(camera[i], true);
            }
        }

Oder man kann die drei Wait Methoden geschickter parallel aufrufen.
Danke! :)

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Palladin007 - Fr 21.04.17 15:06

Sicher, dass Du da synchron drauf warten willst/musst?
Denn genau das tust Du, wenn Du mit Wait() arbeitest.

Asynchron wartest Du, wenn Du das await-Schlüsselwort nutzt.
Dadurch wird die Methode, in der das steht, auch asynchron (braucht also das async in der Definition) und Du kannst darauf wieder starten.
Hier ein MSDN-Artikel dazu: Asynchronous Programming with async and await [https://msdn.microsoft.com/de-de/library/mt674882.aspx]

Am Ende teilst Du dem Nutzer dann mit, dass es jetzt fertig ist.
So hast Du den Vorteil, dass die UI nicht blockiert, während die Tasks laufen.


Wenn ich X Tasks habe, auf die ich in ungeordneter Reihenfolge warten muss, dann lege ich die alle in eine Liste.
Danach kann ich dann mit Task.WhenAll [https://msdn.microsoft.com/de-de/library/system.threading.tasks.task.whenall(v=vs.110).aspx] oder (oder Task.WhenAny [https://msdn.microsoft.com/de-de/library/system.threading.tasks.task.whenany(v=vs.110).aspx]) auf alle diese Tasks gleichzeitig warten.


C#-Quelltext
1:
2:
3:
4:
var tasks = Enumerable.Range(03)
    .Select(i => Task.Factory.StartNew(() => r.IGrab2.G2Wait(camera[i])));

await Task.WhenAll(tasks);


doubleII - Fr 21.04.17 15:54

Danke