8

Ví dụ, sự khác biệt giữa mã nàySự khác biệt giữa việc sử dụng chỉ asynс Nhiệm vụ và Tác vụ là gì?

public Task<IList<NewsSentimentIndexes>> GetNewsSentimentIndexes(DateTime @from, DateTime to = new DateTime(), string grouping = "1h") 
    { 
     var result = _conf.BasePath 
      .AppendPathSegment("news-sentiment-indexes") 
      .SetQueryParams(new 
      { 
       from = from.ToString("s"), 
       to = to.ToString("s"), 
       grouping 
      }); 

     return result 
      .GetStringAsync() 
      .ContinueWith(Desereialize<IList<NewsSentimentIndexes>>); 
    } 

public async Task<IList<NewsSentimentIndexes>> GetNewsSentimentIndexes(DateTime @from, DateTime to = new DateTime(), string grouping = "1h") 
    { 
     var result = _conf.BasePath 
      .AppendPathSegment("news-sentiment-indexes") 
      .SetQueryParams(new 
      { 
       from = from.ToString("s"), 
       to = to.ToString("s"), 
       grouping 
      }); 

     var newsStr = await result.GetStringAsync(); 
     return JsonConvert.DeserializeObject<NewsSentimentIndexes>(newsStr); 
    } 

Cái nào là đúng hoặc làm việc nhanh hơn? Và chỉ cần gọi phương pháp này cần phải chờ đợi hoặc chỉ là một nhiệm vụ?

Trả lời

6

async tốt hơn. Bạn nên luôn luôn thích sử dụng await thay vì ContinueWith. Tôi đi vào chi tiết của why ContinueWith is bad trên blog của tôi.

Sự khác biệt ngữ nghĩa giữa hai lần triển khai này là do hai khác biệt: có hay không async được sử dụng và có sử dụng ContinueWith hay không.

Xóa async thay đổi ngữ nghĩa ngoại lệ. Khi sử dụng async, bất kỳ trường hợp ngoại lệ nào cũng bị bắt (bởi máy trạng thái do trình biên dịch tạo ra) và được đặt trên tác vụ được trả về. Nếu không có async, ngoại lệ được nêu trực tiếp (đồng bộ). Vì vậy, nếu BasePath, AppendPathSegment, SetQueryParams hoặc GetStringAsync ném (hoặc trả lại null hoặc bất kỳ thứ gì tương tự), thì ngoại lệ đó sẽ được nâng lên đồng bộ thay vì không đồng bộ, điều này có thể gây nhầm lẫn cho người gọi.

Sử dụng ContinueWith thay đổi ngữ nghĩa thực thi. Trong trường hợp này, Deserialize sẽ được lên lịch vào TaskScheduler.Current. Sự phụ thuộc này vào TaskScheduler hiện tại là một trong những phần khó nhất của ContinueWith.

+0

Hãy cho tôi biết làm thế nào để có một WaitAll và sự tiếp tục của họ. Nó là không thể sử dụng chờ đợi –

+0

'Task.WaitAll ( _newsService.GetAll (DateTime.Now.AddYears (-1), để: DateTime.Now) .ContinueWith (ContinuationAction), _tradingPairService.GetAllExchangeTradingPairAsync (ExchangeId, TradingPairId) .ContinueWith (ContinuationAction), _companyTypesService.GetAll(). ContinueWith (ContinuationAction)); ' –

+0

Tôi đọc blog của bạn cảm ơn bạn, nhưng bạn phải WaitAll ví dụ, với các nhiệm vụ tương tự. Với sự tiếp tục của cùng một –

-3

Công việc không đồng bộ trả về đối tượng, trong khi Tác vụ thì không.

Vì vậy, bạn có thể làm điều này với Async Nhiệm vụ:

var yourTask = AsyncTask() 

khi bạn có thể làm điều này với công tác bình thường:

NormalTask().someFunction() 
5

Cả hai phương pháp trả về cùng loại: Task. Nhưng phương pháp async cho phép sử dụng từ khóa await trong cơ thể của mình. Nó thông báo trình biên dịch để tạo ra máy nhà nước cho await và tất cả của nó. Giới thiệu về hiệu suất không đồng bộ/chờ đợi, bạn có thể đọc this post

+0

Nhưng cả hai phương pháp đều không đồng bộ, phải không? –

+0

Có, họ đang có. Hơn nữa, bạn có thể sử dụng 'await' với bất kỳ phương thức nào (không đồng bộ và không đồng bộ). – g4s8

Các vấn đề liên quan