Tôi đang triển khai dịch vụ không đồng bộ. Sau khi đánh giá example của Microsoft, tôi tự hỏi liệu cách tiếp cận của họ có thực sự không đồng bộ hay không. Tôi khá chắc chắn nó là, nhưng một số mẫu tôi đã nhìn thấy trực tuyến và tham số AsyncCallback
làm cho tôi tự hỏi.Dịch vụ WCF không đồng bộ thực sự
Theo ví dụ này, chúng ta cần phải thực hiện các Begin và End phương pháp cặp như thế này:
public IAsyncResult BeginGetAcmeAnvil(AsyncCallback callback, object state)
{
// Starts synchronous task
var acmeAsyncResult = new AcmeAsyncResult<Anvil>
{
Data = new Anvil()
};
return acmeAsyncResult;
}
public Anvil EndGetAcmeAnvil(IAsyncResult result)
{
var acmeAsyncResult = result as AcmeAsyncResult<Anvil>;
return acmeAsyncResult != null
? acmeAsyncResult.Data
: new Anvil();
}
Khá đơn giản, nhưng tại sao chúng ta có một tham số AsyncCallback
? Chúng ta có nên thực hiện cuộc gọi đến callback
để kích hoạt phương thức Kết thúc không?
Đây là những gì tôi có trong tâm trí:
public delegate void AsyncMethodCaller(AcmeAsyncResult<Anvil> acmeAsyncResult,
AsyncCallback callback);
public IAsyncResult BeginGetAcmeAnvil(AsyncCallback callback, object state)
{
var acmeAsyncResult = new AcmeAsyncResult<Anvil>();
var asyncMethodCaller = new AsyncMethodCaller(GetAnvilAsync);
// Starts asynchronous task
asyncMethodCaller.BeginInvoke(acmeAsyncResult, callback, null, null);
return acmeAsyncResult;
}
private void GetAcmeAnvilAsync(AcmeAsyncResult<Anvil> acmeAsyncResult,
AsyncCallback callback)
{
acmeAsyncResult.Data = new Anvil();
callback(acmeAsyncResult); // Triggers EndGetAcmeAnvil
}
public Anvil EndGetAcmeAnvil(IAsyncResult result)
{
var acmeAsyncResult = result as AcmeAsyncResult<Anvil>;
return acmeAsyncResult != null
? acmeAsyncResult.Data
: new Anvil();
}
tôi đã làm một số thử tải bằng loadUI, nhưng không có thay đổi hiệu suất rõ ràng.