2017-01-07 2 views
0

Je souhaite ajouter plusieurs paramètres dans une tâche contenant une action. J'ai examiné l'actuel question pile débordement Create a Task with an Action<T>Création d'une tâche avec une action <T, T, ... n> paramètres multiples

me aider Veuillez comment transmettre plusieurs arguments dans une méthode d'action dans une tâche

Action<string, int> action = (string msg, int count) => 
    { 
     Task.Factory.StartNew(async() => 
      { await LoadAsync(msg, count); }); 
    }; 


Task task = new Task(action, ....); 

La méthode d'action est

public static async Task<string> LoadAsync(string message, int count) 
{ 
    await Task.Run(() => { Thread.Sleep(1500); }); 
    Console.WriteLine("{0} {1} Exceuted Successfully !", message ?? string.Empty, (count == 0) ? string.Empty : count.ToString()); 
    return "Finished"; 
} 

me aider Veuillez comment Créer une action d'une méthode asynchrone et comment ajouter l'action dans la tâche.

Répondre

2

Passez simplement les paramètres comme ceci.

Action<string, int> action = async (msg, count) => await LoadAsync(msg, count); 
Task task = new Task(() => action("", 0)); // pass parameters you want 

Si vous souhaitez également obtenir la valeur de retour

Func<string, int, Task<string>> func = LoadAsync; 
Task<string> task = func("", 0); // pass parameters you want 

var result = await task; // later in async method 
2

Créer un autre lambda qui exécute votre action et passer des paramètres, il

var task = Task.Run(() => youraction(parameter1, parameter2)); 

En particulier votre cas, vous n'avez pas besoin de créer beaucoup de tâches et discussions qui seront créées avec Task.Run ou StartNew

Si vous changez votre méthode pour être asynchrone sans perdre de fils avec Thread.Sleep

public static async Task<string> LoadAsync(string message, int count) 
{ 
    await Task.Delay(1500); 

    var countOutput = count == 0 ? string.Empty : count.ToString(); 
    var output = $"{message} {countOUtput}Exceuted Successfully !"; 
    Console.WriteLine(output); 

    return "Finished"; 
} 

Ensuite, vous pouvez appeler partout sans Task.Run

await LoadAsync("", 0); 

Votre méthode LoadAsync déjà retourner un Task<string> que vous pouvez démarrer et « attendre " quand tu veux. Vous n'avez donc pas besoin d'utiliser Task.Run pour démarrer une autre tâche (thread dans votre cas).

var task = LoadAsync("param1", 3); 
// do something else 
var result = await task; 
+0

Merci beaucoup. J'ai reçu beaucoup de connaissances de votre réponse concernant Task. –