2010-08-27 25 views
6

Tôi cần gọi không đồng bộ một dịch vụ web từ ứng dụng ASP.NET. Aspx không cần câu trả lời từ dịch vụ web. Nó chỉ là một thông báo đơn giản.Làm thế nào để gọi không đồng bộ một dịch vụ web từ một ứng dụng ASP.NET?

Tôi đang sử dụng phương thức ...Async() từ dịch vụ web và <%@Page Async="True" %>.

ws.HelloWorldAsync(); 

Vấn đề của tôi: yêu cầu trang web đang chờ phản hồi dịch vụ web.

Cách giải quyết vấn đề này? Làm thế nào để tránh rò rỉ tài nguyên khi dịch vụ web bị hỏng hoặc khi có quá tải?

Trả lời

0

Trong trường hợp của bạn, bạn có thể sử dụng ThreadPool ThreadPool.QueueUserWorkItem (...) để gọi dịch vụ web trong chuỗi gộp.

0

Tôi đã sử dụng các chuỗi đơn giản để thực hiện việc này trước đây. ví dụ:

Thread t = new Thread(delegate() 
{ 
    ws.HelloWorld(); 
}); 
t.Start(); 

Chuỗi sẽ tiếp tục chạy sau khi phương thức đã trả về. Nhìn xung quanh, có vẻ như cách tiếp cận ThreadPool isn't always recommended

+0

Tôi hiểu rằng việc sử dụng ThreadPool sẽ can thiệp vào việc thực thi ASP.NET. Nhưng việc tạo nhiều luồng sẽ làm giảm hiệu suất cho toàn bộ ứng dụng web. – Jorge

0

Bắt đầu một chuỗi mới có lẽ là giải pháp dễ nhất vì bạn không quan tâm đến việc nhận được thông báo về kết quả.

new Thread(() => ws.HelloWorld()).Start 
1

Proxy dịch vụ web thường có phương thức Bắt đầu và Kết thúc. Bạn có thể sử dụng chúng. Ví dụ bên dưới cho thấy cách bạn có thể gọi phương thức bắt đầu và sử dụng gọi lại để hoàn thành cuộc gọi. Cuộc gọi đến MakeWebServiceAsynCall sẽ trở lại ngay lập tức. Câu lệnh sử dụng sẽ đảm bảo đối tượng được xử lý an toàn.

void MakeWebServiceAsynCall() 
    { 
     WebServiceProxy proxy = new WebServiceProxy(); 
     proxy.BeginHelloWorld(OnCompleted, proxy); 
    } 
    void OnCompleted(IAsyncResult result) 
    { 
     try 
     { 
      using (WebServiceProxy proxy = (WebServiceProxy)result.AsyncState) 
       proxy.EndHelloWorld(result); 
     } 
     catch (Exception ex) 
     { 
      // handle as required 
     } 
    } 

Nếu bạn cần biết liệu cuộc gọi có thành công hay không, bạn sẽ cần đợi kết quả.

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