Autor Beitrag
doubleII
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: Fr 21.04.17 14:44 
Hallo zusammen,

welcher ist der beste Weg mehr Methoden parallel laufen zu lassen?
ausblenden C#-Quelltext
1:
task t = Task.Run(() => {}); t.Wait();					

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


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

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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

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 oder (oder Task.WhenAny) auf alle diese Tasks gleichzeitig warten.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: Fr 21.04.17 15:54 
Danke