2017-09-25 1 views
0

Essayer de passer fonction au lieu d'expression lambda et enfin mélangé pourquoi ligne:Créer une tâche sans lambda

int t2 = await Task.Run(()=>Allocate2()); 

soulève pas d'erreur. Cette expression lambda ()=>Allocate2() ne renvoie pas Task. Pourquoi pas d'erreur?

Comment créer une tâche sans expression lambda avec la fonction Allocate?

static async void Example() 
    { 

     int t = await Task.Run(Allocate); 
     int t2 = await Task.Run(()=>Allocate2()); 
     Console.WriteLine("Compute: " + t); 
    } 


static Task<int> Allocate() 
    { 
    return 1; 
    } 


static int Allocate2() 
    { 
    return 1; 
    } 
+3

['Task.Run'] (https://msdn.microsoft.com/en-us/library/hh195051 (v = vs.110) .aspx) renvoie' Task'. Ce que cette tâche fait à l'intérieur est une autre histoire (voir les surcharges). – Sinatr

+0

en cours d'exécution, j'obtiens cette erreur 'Impossible de convertir le type 'int' en 'System.Threading.Tasks.Task '' car votre type de retour n'est pas compatible. mais qu'est-ce que vous essayez d'accomplir? –

+0

J'essaie d'exécuter la tâche sans utiliser l'expression lambda – vico

Répondre

3

Task.Run() veut vous faire passer un ou FuncAction parameterless à elle.

Un lambda peut être affecté à un Action ou un Func (selon le cas) qui est pourquoi appeler Task.Run() avec un lambda fonctionne pour vous.

Si vous ne souhaitez pas utiliser un lambda, vous devez explicitement créer un Action ou un Func, en passant la méthode que vous voulez appeler au constructeur du Action ou Func.

Ce qui suit démontre:

static void Main() 
{ 
    var task = Task.Run(new Action(MyMethod)); 
} 

static void MyMethod() 
{ 
    Console.WriteLine("MyMethod()"); 
} 

OU:

static void Main() 
{ 
    var task = Task.Run(new Func<int>(MyMethod)); 
} 

static int MyMethod() 
{ 
    Console.WriteLine("MyMethod()"); 
    return 42; 
} 

Notez que cela ne fonctionne pas si la méthode a besoin d'un ou plusieurs paramètres. Dans ce cas, vous devez utiliser un lambda.

+0

Vous pouvez également effectuer une conversion explicite comme alternative à' new' ing. –

+0

Comment utiliser la distribution explicite dans ce cas? – vico

+0

@vico Vous pouvez le lancer comme suit: 'var task = Task.Run ((Func ) MyMethod);' - mais je ne pense pas vraiment que ce soit une amélioration. Il finit avec plus ou moins le même code généré. (Voir [ici] (https://stackoverflow.com/questions/24705925/cast-to-func-vs-new-func) pour plus d'informations) –