2013-02-07 94 views
1

我想同時處理許多任務,因爲他們不需要eachothers完成移動到下一個任務。我使用了同步過程並試圖將其變爲異步。然而,在測量性能時,兩種方法需要完全相同的時間才能完成(大約30秒),我期望異步更快......如果我已經1)得到以下正確2)瞭解異步對於(我懷疑這是問題)。異步等待併發在長功能

public class ExpensiveTask { 
private int _seed; 
public ExpensiveTask(int seed){ _seed = seed; } 
public Process() { //TODO various things } 
} 

public class Controller { 
public static void main(string[] args){ 
    var program = new Controller(); 
    program.RunAsync(); // Runtime 36.9s 
    program.Run(); // Runtime 36.6s 
} 

void Run(){ 
    Process(1); 
    Process(2); 
    Process(3); 
} 

async void RunAsync(){ 
     var taskList = new List<Task>(); 
     taskList.Add(ProcessAsync(1)); 
     taskList.Add(ProcessAsync(2)); 
     taskList.Add(ProcessAsync(3)); 

     await Task.WhenAll(taskList); 
} 

async Task ProcessAsync(int seed){ 
     var task = new ExpensiveTask(seed); 

     task.Process(); 
} 

void Process(int seed){ 
     var task = new ExpensiveTask(seed); 

     task.Process(); 
} 

}

回答

5

async不運行的線程池代碼。如果您希望在不同的線程執行你的CPU綁定的代碼,你需要使用Task.Run

Task ProcessAsync(int seed){ 
    var task = new ExpensiveTask(seed); 
    return Task.Run(() => task.Process()); 
} 
+0

想我剛剛在使用新的關鍵字趕上了。 – ct5845