Với logic kinh doanh đóng gói đằng sau đồng bộ dịch vụ gọi ví dụ .:chiến lược để gọi dịch vụ đồng bộ gọi không đồng bộ trong C#
interface IFooService
{
Foo GetFooById(int id);
int SaveFoo(Foo foo);
}
cách tốt nhất để mở rộng/sử dụng các cuộc gọi dịch vụ trong một không đồng bộ thời trang là gì?
Hiện nay tôi đã tạo ra một AsyncUtils lớp đơn giản:
public static class AsyncUtils
{
public static void Execute<T>(Func<T> asyncFunc)
{
Execute(asyncFunc, null, null);
}
public static void Execute<T>(Func<T> asyncFunc, Action<T> successCallback)
{
Execute(asyncFunc, successCallback, null);
}
public static void Execute<T>(Func<T> asyncFunc, Action<T> successCallback, Action<Exception> failureCallback)
{
ThreadPool.UnsafeQueueUserWorkItem(state => ExecuteAndHandleError(asyncFunc, successCallback, failureCallback), null);
}
private static void ExecuteAndHandleError<T>(Func<T> asyncFunc, Action<T> successCallback, Action<Exception> failureCallback)
{
try
{
T result = asyncFunc();
if (successCallback != null)
{
successCallback(result);
}
}
catch (Exception e)
{
if (failureCallback != null)
{
failureCallback(e);
}
}
}
}
nào cho phép tôi gọi bất cứ điều gì không đồng bộ:
AsyncUtils(
() => _fooService.SaveFoo(foo),
id => HandleFooSavedSuccessfully(id),
ex => HandleFooSaveError(ex));
Trong khi công trình này trong trường hợp sử dụng đơn giản, nó nhanh chóng trở nên phức tạp nếu quá trình khác cần phải phối hợp về các kết quả, ví dụ nếu tôi cần lưu ba đối tượng không đồng bộ trước khi luồng hiện tại có thể tiếp tục thì tôi muốn một cách để đợi/tham gia các chuỗi công việc.
Tùy chọn Tôi đã nghĩ đến việc cho đến nay bao gồm:
- có AsyncUtils trả về một WaitHandle
- có AsyncUtils sử dụng một AsyncMethodCaller và trả về một IAsyncResult
- viết lại API để bao gồm Begin, cuộc gọi End async
ví dụ một cái gì đó tương tự:
interface IFooService
{
Foo GetFooById(int id);
IAsyncResult BeginGetFooById(int id);
Foo EndGetFooById(IAsyncResult result);
int SaveFoo(Foo foo);
IAsyncResult BeginSaveFoo(Foo foo);
int EndSaveFoo(IAsyncResult result);
}
Có phương pháp nào khác mà tôi nên cân nhắc không? Những lợi ích và cạm bẫy tiềm năng của mỗi loại là gì?
Lý tưởng nhất là tôi muốn giữ cho lớp dịch vụ đơn giản/đồng bộ và cung cấp một số phương thức tiện ích dễ sử dụng để gọi chúng không đồng bộ. Tôi muốn được nghe về các giải pháp và ý tưởng áp dụng cho C# 3.5 và C# 4 (chúng tôi chưa nâng cấp nhưng sẽ thực hiện trong tương lai gần tương lai).
Mong ý tưởng của bạn.
Tại sao bạn không sử dụng Thư viện song song công việc? Nó đã được thực hiện cho việc này. http://msdn.microsoft.com/en-us/library/dd460717.aspx –
Những gì John nói, nhưng cụ thể, hãy thử 'Lazy'. –
@Steven: Đó phải là Nhiệm vụ, đối với loại hoạt động này. Lazy là để khởi tạo. –