2016-12-23 38 views
0

我是新的任務工作,需要幫​​助。 我有一個網絡服務,爲什麼在任務工廠中使用ASYNC - AWAIT?

此服務將停止所有任務,並在每30分鐘重新開始。

Q1 =是否爲常規代碼樣本?

Q2 =該代碼適用於我,但是我需要在此項目中使用ASYNC AWAIT ?我使用.net 4.0。

Thx。

private CancellationTokenSource tokenSource; 
private List<Task> Tasks; 
public virtual void Start() 
{ 
    // start 
    Tasks = new List<Task>(); 
    tokenSource = new CancellationTokenSource(); 
    for (int i = 0; i < 3; i++) 
    { 
     Tasks.Add(Task.Factory.StartNew(() => SomeWork(), 
       tokenSource.Token, 
       TaskCreationOptions.LongRunning, 
       TaskScheduler.Default)); 
    } 
} 

public void Stop() 
{ 
    tokenSource.Cancel(); 
    Task.Factory.ContinueWhenAll(Tasks.ToArray(), t => 
    { 
     Console.WriteLine("all finished"); 
     // start again 
     Start(); 
    }); 
} 

int i = 0; 
public void SomeWork() 
{ 
    while (!tokenSource.IsCancellationRequested) 
    { 
     try 
     { 
      Thread.Sleep(1000 * 4); 
      Console.WriteLine(Task.CurrentId + " finised!"); 
     } 
     catch (Exception) { } 
    } 
} 
+0

你並不需要使用異步/ AWAIT - 事實上,你不能使用異步/等待着.NET 4中,這樣的問題是沒有實際意義。 –

+0

我知道異步/等待可以用某種方式在.net 4.0中使用,但問題是我真的需要其實我不知道 – Mennan

+0

是的,你不需要*使用它;這只是一種簡化異步編程的方法。我假設'Thread.Sleep(1000 * 4);'只是模擬一些無法在幾秒鐘內取消的代碼的一種方式。 –

回答

1

你真的需要使用async/await關鍵字來啓動和停止任務嗎?

您應該在Web服務中使用async/await關鍵字嗎?不一定,因爲一旦任務完成,您就不能從捕獲上下文並執行剩餘的方法中獲益。你的啓動方法只需啓動3個任務,並返回而無需等待任何任務完成。所以這種方法本質上不是「等待」或異步的。

可以都利用異步的/等待在您的止損方法的關鍵字,如果你想讓它異步,即你想要這個方法的任何調用者能夠異步調用它,只做一次的任務有實際上已停止:

public async Task StopAsync() 
{ 
    tokenSource.Cancel(); 
    await Task.WhenAll(Tasks.ToArray()); 
    Console.WriteLine("all finished"); 
    Start(); 
} 


await StopAsync(); 
//now all tasks have been stopped...do something 

當使用async和await關鍵字時,編譯器會爲您生成一個狀態機。異步方法的開始與任何其他方法一樣執行,當它遇到「await」關鍵字時,它將從方法返回,並告訴等待(即異步操作),一旦完成,就運行方法的其餘部分。有關詳細信息,請參閱以下鏈接。

How and When to use `async` and `await`

+0

thx爲你的答覆,我想我不會使用異步,所以它在這個樣本中不必要的 – Mennan