2012-11-26 48 views
47

Tôi có một ứng dụng. Ứng dụng này sử dụng giao diện để truy cập cơ sở dữ liệu. Giao diện này có thể được thực hiện bởi nhiều lớp. Ví dụ, một sử dụng EF 4.4, nhưng các lớp khác có thể sử dụng EF5 hiệu quả hơn. Trong tương lai có lẽ tôi sẽ sử dụng EF6 vì nó sử dụng các phương thức không đồng bộ. Trong ví dụ này, tất cả các phương pháp đều sử dụng EF, nhưng có lẽ các tùy chọn khác có thể sử dụng các cách khác.Giao diện và các phương thức không đồng bộ

Ứng dụng được mã hóa một lần, sử dụng giao diện và theo tệp cấu hình, sử dụng triển khai này hoặc triển khai khác, vì vậy tôi chỉ cần sửa đổi mã ở một nơi, hàm tạo, để thêm tùy chọn mới trong instantiation của lớp được gán cho giao diện.

Hiện tại tất cả các phương thức của các lớp không phải là async, nhưng trong tương lai nếu tôi sử dụng EF6, tôi muốn sử dụng các phương pháp không đồng bộ, vì vậy tôi không biết có thể sử dụng EF6 không và thực hiện giao diện có thể sử dụng các phương thức async.

Đối với các phương thức không đồng bộ của EF6, tôi sẽ sử dụng mẫu async/awiat, vì vậy trong phương thức lớp của tôi, tôi cần sử dụng thuộc tính async. Điều này cho phép tôi sử dụng từ khóa await khi tôi gọi phương thức async của EF6.

Nhưng lớp này có thể triển khai giao diện trong lần đầu tiên là cho các phương thức đồng bộ?

Có cách nào trong ứng dụng chính tôi có thể sử dụng nhiều triển khai mà không cần sửa đổi mã không? Một số triển khai sẽ sử dụng các phương thức không đồng bộ trong khi các phương thức khác sẽ đồng bộ.

+2

Hãy nhớ rằng 'async' không phải là một phần của chữ ký; một phương thức không đồng bộ và không đồng bộ có thể thực hiện cùng một phương thức giao diện. – Servy

+1

Nó không phải là phương pháp đó là awaitable, đó là (trở lại) loại. – rism

+1

Giải thích quá nhiều cho một câu hỏi đơn giản. IMHO. – Mahmoodvcs

Trả lời

55

async không phải là một phần của chữ ký, vì vậy bạn không thực sự cần phải quan tâm đến việc phương pháp triển khai giao diện là async hay không, bạn chỉ cần quan tâm đến các loại thuộc tính, kiểu trả về, tên của phương thức và khả năng truy cập.

Các thực khác biệt là async phương pháp của bạn sẽ cần phải trả lại một Task hoặc một Task<T>, trong khi các phương pháp phi async có nhiều khả năng nhất hiện nay trở void hoặc một số loại, T trực tiếp.

Nếu bạn muốn "tương lai bằng chứng" ứng dụng của bạn một lựa chọn là để đảm bảo rằng tất cả các giao diện của bạn trở Task hoặc Task<T> và cho EF4/triển khai EF5 của bạn, bạn quấn kết quả của bạn trong một nhiệm vụ hoàn thành mặc dù họ đang thực hiện đồng bộ.

Task.FromResult đã được bổ sung trong .NET 4.5, nhưng nếu bạn không có nó, bạn có thể viết riêng của bạn một cách dễ dàng đủ:

public static Task<T> FromResult<T>(T result) 
{ 
    var tcs = new TaskCompletionSource<T>(); 
    tcs.SetResult(result); 
    return tcs.Task; 
} 

Bạn cũng có thể viết một phương pháp CompletedTask mà chỉ đơn giản trả về một công việc mà có đã hoàn thành: (Nó lưu trữ một nhiệm vụ duy nhất vì lý do hiệu quả.)

private static Task _completedTask; 
public static Task CompletedTask() 
{ 
    return _completedTask ?? initCompletedTask(); 
} 

private static Task initCompletedTask() 
{ 
    var tcs = new TaskCompletionSource<object>(); 
    tcs.SetResult(null); 
    _completedTask = tcs.Task; 
    return _completedTask; 
} 

hai phương pháp này sẽ đơn giản hóa quá trình có tất cả các phương pháp của bạn trở về một số loại Task, mặc dù việc này sẽ làm cho mã của bạn một bi t messier cho đến khi bạn có thể sử dụng C# 5.0 để có thể await kết quả.

+0

vì vậy giải pháp duy nhất là buộc tất cả các lớp học phải trả lại một nhiệm vụ? –

+1

Vâng, nó không phải là giải pháp * duy nhất *. Đó là điều tốt nhất mà tôi có thể nghĩ ra. Nếu bạn có C# 5.0 nhưng không phải là EF 6.0 thì bạn vẫn có thể "chờ đợi" kết quả của cuộc gọi phương thức (ngay cả khi chúng đã hoàn thành), điều này sẽ khiến nó không quá khủng khiếp. – Servy

+6

Trong tình huống như thế này (nơi hoạt động của bạn tự nhiên không đồng bộ), bạn có thể làm cho tất cả các phương thức trả về 'Tác vụ' hoặc tạo cả hai phương thức đồng bộ và không đồng bộ song song. –

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