Autor Beitrag
Luccas
Hält's aus hier
Beiträge: 11

Win 8.1, Win 10
C# ( VS 2015 )
BeitragVerfasst: Fr 12.08.16 16:55 
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:
ausblenden C#-Quelltext
1:
public Task(Action<Object> action,Object state)					

Jetzt versuche ich, genau diesen Konstruktor hinzubekommen, aber leider ohne Erfolg.
ausblenden 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
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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

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

Für diesen Beitrag haben gedankt: Luccas
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 12.08.16 18:08 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Luccas
Luccas Threadstarter
Hält's aus hier
Beiträge: 11

Win 8.1, Win 10
C# ( VS 2015 )
BeitragVerfasst: 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:

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


Alle übrigen Varianten hatten funktioniert.

Gruss
Luccas
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 ;)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".