2017-01-07 1 views
0

작업이 포함 된 작업에 여러 매개 변수를 추가하고 싶습니다. 내가 Create a Task with an Action<T>작업이있는 작업 만들기 <T, T, ... n> 여러 매개 변수

이 친절하게 어떻게 작업의 작업 방법에 여러 인수를 전달하는 나에게 도움이 기존의 스택 오버 플로우 문제를 검토

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


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

액션 방법은

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"; 
} 

친절하게 방법을 도와주세요 비동기 메서드의 작업을 만들고 작업에 작업을 추가하는 방법입니다.

답변

2

다음과 같은 매개 변수를 전달하십시오.

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

당신은 또한 당신의 동작을 실행할 다른 람다 만들기 반환 값

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

을 얻을 당신이 만들 필요하지 않습니다 특히이 사건을

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

를 매개 변수를 전달하려면 Task.Run 또는 StartNew으로 작성 될 많은 작업 및 스레드

당신이 그런 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"; 
} 

와 낭비 스레드없이 비동기로 귀하의 방법을 변경하는 경우가 기다리고 있습니다 "시작하고 할 수있는 당신은 Task.Run

await LoadAsync("", 0); 

귀하의 LoadAsync 방법은 이미 Task<string>을 반환하지 않고 어디서든 호출 할 수 있습니다 " 당신이 원할 때마다. 따라서 Task.Run을 사용하여 다른 작업 (사례의 스레드)을 시작할 필요가 없습니다.

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

고마워요. Task에 관한 당신의 대답으로부터 많은 지식을 얻었습니다. –