2013-07-18 39 views
3
public class PerformMainTask() 
{ 
    Task1(); 
    Task2(); 
    PerformLongTask(); 
    Task3(); 
    Task4(); 
} 

我想達成什麼這裏是PerformLongTask()到另一個線程,並繼續與任務3 & Task4即使PerformLongTask()仍在運行。調用長時間運行的方法,並繼續執行其他任務

PerformLongTask()如何應該像在C#5.0的方式?

我需要使用async/await

+0

轉到後臺線程 – Sandy

回答

3

我知道最簡單的辦法是:

Task1(); 
Task2(); 
var task3 = Task.Run(() => PerformLongTask()); 
Task4(); 
Task5(); 
task3.Wait(); //if task3 has not started yet it will be inlined here 

簡單高效。如果您需要傳播錯誤,你應該使用Parallel.Invoke

Parallel.Invoke(
() => { PerformLongTask(); }, 
() => { Task4(); Task5(); } 
); 
+0

Task.Wait將已傳播,在任務發生異常(在'AggregateException'包裝) – Falanwe

+0

@Falanwe不若Task4已經拋出... – usr

+0

我如何刪除task3.Wait()如果我甚至不在乎它是否完成? –

0
public class PerformMainTask() 
{ 
    Task1(); 
    Task2(); 

    Task.WaitAll(Task.Factory.StartNew(() => PerformLongTask()), Task.Factory.StartNew(() => { Task3(); Task4(); })); 
} 
2

假設你正在使用C#5,您的所有任務()方法真正返回一個Task(或任何awaitable),你的代碼看起來應該是:

public async Task PerformMainTask() 
{ 
    await Task1(); 
    await Task2(); 
    // Start long task 
    var longTask = PerformLongTask(); 
    await Task3(); 
    await Task4(); 
    //wait for long task to finish 
    await longTask; 
} 

但是,如果你的長期任務不上自己的平行運行,你可以強制與Task.Run這樣做:

public async Task PerformMainTask() 
{ 
    await Task1(); 
    await Task2(); 
    // Start long task 
    var longTask = Task.Run(PerformLongTask); 
    await Task3(); 
    await Task4(); 
    //wait for long task to finish 
    await longTask; 
} 

如果沒有是你的任務是真正的任務,只是剝離所有的await除了最後一個,你會好到哪裏去。