7

Tôi đang sử dụng asp.net mvc-5 với EF-6 và tôi không chắc chắn nếu sử dụng await + ToListAsync là hợp lệ . Ví dụ tôi có phương pháp kho sau đó trả về một IQeuryable: -Có đúng không nếu tôi đang sử dụng await + ToListAsync() trên IQueryable không được định nghĩa là một nhiệm vụ

public IQueryable<TSet> getAllScanEmailTo() 
{ 
    return t.TSets.Where(a=>a.Name.StartsWith("ScanEmail"));  
} 

Và tôi gọi đó là như sau: -

var emailsTo = await repository.getAllScanEmailTo().ToListAsync(); 

Lúc đầu tôi mặc dù tôi sẽ nhận được một lỗi vì tôi sử dụng "chờ đợi" một phương pháp mà không được định nghĩa là một nhiệm vụ, nhưng ở trên làm việc tốt ,, vì vậy bất cứ ai có thể tư vấn về điều này xin vui lòng?

Trả lời

12

Lúc đầu tôi mặc dù tôi sẽ nhận được một lỗi bởi vì tôi đang sử dụng "chờ đợi" một phương pháp mà không được định nghĩa là một nhiệm vụ, nhưng làm việc cũng

Trên thực tế, trên bạn là đang chờ phương thức trả về Task<T>, trong đó TList<TSet>. Nếu bạn nhìn vào phương pháp mở rộng QueryableExtensions.ToListAsync, bạn sẽ thấy rằng nó trả về một Task<List<TSource>>. Bạn đang chờ đợi không đồng bộ trên phương thức này để truy vấn cơ sở dữ liệu, tạo danh sách và trả lại cho người gọi. Khi bạn await trên phương thức như vậy, phương thức sẽ không trở lại cho đến khi thao tác hoàn tất. async-await làm cho mã của bạn cảm thấy đồng bộ, trong khi thực thi thực sự không đồng bộ.

+1

Giải thích tốt và đầy đủ. –

+0

@Yuval của tôi đã nhận thức được điều này, nhưng thường tôi sử dụng đang chờ đợi trên một nhiệm vụ ,, và tất cả các chuỗi phương pháp bên trong mã của tôi sẽ được công việc chờ đợi .. nhưng kể từ khi tôi không thể quấn IQueryable với một nhiệm vụ vì vậy tôi đã làm nó theo cách này ,, tôi đang sử dụng IQueryable -> chờ đợi .tolistasync() ... do đó, mã này sẽ hoạt động như-nếu IQueryable được bọc bên trong một Task ?. vì vậy trong trường hợp của tôi thread iis sẽ được phát hành cho đến khi thực hiện hoàn thành tolistasync(), như bình thường đang chờ hoạt động? –

+0

@johnG Có. Chủ đề sẽ được phát hành trong khi truy vấn thực hiện và trả lại khi nó kết thúc. –

8

Thực ra không có vấn đề gì vì bạn đang chờ đợi ToListAsync() không phải là getAllScanEmailTo().

EDIT: Để xem cách mẫu đang chờ xử lý không đồng bộ đang hoạt động, bạn có thể xem số link này. Đây là một hình ảnh hữu ích từ đó

enter image description here

+0

vì vậy cách tiếp cận của tôi có hợp lệ không? hoặc làm như vậy sẽ tạm dừng thực thi cho đến khi phương thức ToListAsync() của các lần hoàn thành IQueryable hoàn thành. –

+0

Tôi chỉnh sửa bài đăng của mình. –

+0

có tôi biết con đường thực hiện này rất tốt, nhưng câu hỏi ban đầu của tôi là làm thế nào sẽ chờ đợi + Iqurable làm việc cùng nhau. vì tôi không thể bọc một IQueryable bên trong một nhiệm vụ .. vì vậy tôi đang sử dụng await + ToListAsync() nhưng trên một phương pháp phi nhiệm vụ, do đó, điều này sẽ có bất kỳ tác dụng phụ ,, hoặc mã của tôi sẽ làm việc như-nếu tôi đã gói IQueryable bên trong một Task? bạn có nhận được quan điểm của tôi không? –

2

You are not "chờ một phương pháp". Bạn đang đang chờ một Task, đó là một điều đáng ngờ.

Bạn gọi getAllScanEmailTo trả về số IQueryable<TSet> mà sau đó bạn gọi ToListAsync trả về số Task<List<TSet>> bạn đang chờ.

+0

để sử dụng IQuerable với chờ đợi như tôi đang làm là hợp lệ? hoặc làm như vậy sẽ tạm dừng thực thi cho đến khi phương thức ToListAsync() của các lần hoàn thành IQueryable hoàn thành. –

+0

@johnG có. Bạn đang chờ 'Task', không phải là' IQueryable'. Và có, bạn sẽ đợi 'ToListAsync' hoàn tất. – i3arnon

+0

nhưng làm như vậy sẽ tạm dừng thực thi cho đến khi phương thức ToListAsync() của IQueryable hoàn tất ?? –

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