Entwickler-Ecke

Basistechnologien - Fehler bei TPL und Übergabe Action<Object>


Luccas - Fr 12.08.16 16:55
Titel: Fehler bei TPL und Übergabe Action<Object>
Hallo zusammen

Ich bin's wieder und traue mich mit meinem nächsten Problem.

Ich möchte ein TPL-Programm schreiben mit Übergabe eines Parameters, d.h. der Task soll Daten mitbekommen (zieht nur die Wurzel einer übergebenen Zahl).
Lt. Konstruktor funktioniert das in seiner Basisform so:

C#-Quelltext
1:
public Task(Action<Object> action,Object state)                    

Jetzt versuche ich, genau diesen Konstruktor hinzubekommen, aber leider ohne Erfolg.

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:
    class Program
    {
        
        static void Main(string[] args)
        {
            Action<double> Sub;

            double Zahl = 144;
            Sub = SubTask;
            Task TaskObj = new Task(Sub, Zahl);
           
            TaskObj.Start();
            TaskObj.Wait();
        }

        static void SubTask(double Zahl)
        {
            Console.Write("\n Start Sub-Task\n");
            Console.Write("\n\t Zahl= {0} Wurzel= {1}", Zahl, Math.Sqrt((double)Zahl));
            Console.Write("\n Ende Sub-Task\n");
            Console.Write("\n\n");
        }
    }

2 Fehlermeldungen bei zeile 10:
1. Argument 1: Konvertierung von System.Action<double> in System.Action nicht möglich.
2. Argument 2: Konvertierung von double in System.Threading.CancellationToken nicht möglich.

Hinweis:
Mit Anwendung eines Lamba-Ausdruckes oder Task.Run funktioniert alles. Aber ich wollte das Beispiel auch wie oben gezeigt hinbekommen, also mit explizit definiertem Action-Objekt. Geht das überhaupt?

Gruss Luccas

Moderiert von user profile iconTh69: B- durch C#-Tags ersetzt
Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt


Ralf Jansen - Fr 12.08.16 17:33

Aber auch wenn du genau diesen Aufruf willst solltest du dir klar sein das man es genau so eher nicht benutzen sollte.

Action != Action<object> != Action<double>
Wenn du diesen Syntax benutzen willst mußt du auch explizit einen Action<object> draus machen also


C#-Quelltext
1:
2:
var Sub = new Action<object>(obj => SubTask((double)obj));
Task TaskObj = new Task(Sub, Zahl);


Delete - Fr 12.08.16 18:08

- Nachträglich durch die Entwickler-Ecke gelöscht -


Luccas - Di 16.08.16 11:02

Hallo

Bin wieder da! Vielen Dank für den Tipp.
Ich habe den Code noch ein wenig geändert, weil ich den var-Typ nicht so mag.
So wird ein Schuh draus:


C#-Quelltext
1:
Action<Object> Sub = new Action<object>(obj => SubTask((double)obj));                    


Alle übrigen Varianten hatten funktioniert.

Gruss
Luccas


Christian S. - Di 16.08.16 11:22

user profile iconLuccas hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe den Code noch ein wenig geändert, weil ich den var-Typ nicht so mag.

var ist kein Typ, sondern nur eine kürzere Schreibweise für die selbe Deklaration ;)