2015-05-08 13 views
6

Với mã này:Bao bì My Head Khoảng chờ async và NHibernate

private ISession _session; 

public async Task<T> GetAsync<T>(int id) where T : ISomeEntity 
{ 
    //how to call and return _session.Get<T>(id) asynchronous 
} 

Có thể gọi NHibernate ISession.Get<T>() không đồng bộ? Có thể tư vấn? Không đáng?

+1

NHibernate hiện hỗ trợ các hoạt động async ngay bây giờ: http://enterprisecraftsmanship.com/2017/12/11/nhibernate-async-support/ – Vladimir

Trả lời

13

NHibernate không hỗ trợ Async chờ đợi trong cảm giác khuôn khổ tổ chức thực hiện theo mặc định. Tuy nhiên nó sẽ được khuyến khích để làm như vậy (nếu bạn có thể) kể từ khi một cuộc gọi cơ sở dữ liệu là một cuộc gọi IO đó là một ứng cử viên rất tốt để làm cho nó không đồng bộ. Kết quả là trong khi chờ đợi phản hồi từ DB, chuỗi của bạn sẽ quay trở lại hồ bơi thay vì là pend và nó sẽ làm cho ứng dụng của bạn dễ mở rộng hơn. Hiện hỗ trợ không đồng bộ. Tôi đã chia nhỏ NHibernate để đạt được điều này. Trong ngã ba của tôi mà tôi gọi NHibernateX, có phương pháp async như GetAsync, ListAsync, ToListAsync vv Đây là nguồn và gói NuGet:

https://github.com/ReverseBlade/nhibernate-core

https://www.nuget.org/packages/NHibernateX/

+1

Xin chào, tôi đã kéo thư viện NHibernateX xuống và đang xem qua nó. Tôi đã tự hỏi nếu bạn xảy ra để có bất kỳ ví dụ để chia sẻ vì vậy tôi có thể có được một số ý tưởng tốt hơn về cách đặt này để sử dụng. Cảm ơn! – MattB

+1

@MattB xem thay đổi API này, https://github.com/OnurGumus/nhibernate-core/commit/ef67c54724c24ce44915805331dd4af25917f15a –

8

Nếu thao tác cơ bản không đồng bộ theo một cách nào đó (ví dụ: async-await, BeginXXX/EndXXX, v.v.) không có giá trị khi thêm một wrapper async xung quanh nó.

async hữu ích trong 2 trường hợp: khả năng mở rộng và phản hồi. Làm async qua đồng bộ hóa không hỗ trợ khả năng mở rộng và để phản hồi, bạn có thể chỉ cần sử dụng Task.Run để giảm tải công việc đó sang một chuỗi ThreadPool khác khi cần thay vì thêm phương thức chuyên dụng.

khác ở Should I expose asynchronous wrappers for synchronous methods?

+0

Ngay cả khi Async Await sẽ tắt oad thực hiện một hồ bơi thread, không phải là một cơ chế tốt hơn so với sử dụng Task, mà offloads từ đầu của phương pháp. Trong trường hợp này nó có thể được đồng bộ cho đến khi nó không mất nhiều thời gian và không đồng bộ từ điểm chờ đợi được sử dụng –

+0

@MrinalKamboj async-await không offload đến 'ThreadPool'. Tất cả từ khóa 'async' đều cho phép bạn sử dụng 'await' bên trong phương thức, và không có gì để' chờ đợi 'ở đây. – i3arnon

+0

Khi sử dụng chờ trong một phương thức được đánh dấu là không đồng bộ, chúng tôi có phải không nằm trong ngữ cảnh của chuỗi chủ đề/chủ đề chính, sau đó nó phải là một chuỗi riêng biệt. Trong thực tế, trả về cho các phương thức Async chủ yếu là Task . Phần thú vị là bài đăng đang đợi nó chuyển về ngữ cảnh của chủ đề chính/gọi điện thoại như UI –

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