2012-10-19 29 views
5

Tôi đang cố gắng mở proxy trên một chuỗi (trong nền), luồng tạo một phiên bản proxy mới, gọi phương thức dịch vụ và ngay sau khi phân phát dịch vụ.Bắt đầu nhiều dịch vụ trên các chủ đề

Tất cả điều này xảy ra trên một sợi:

var background = new Thread(() => 
{ 
    var proxy = new AssignmentSvcProxy(new EndpointAddress(worker.Address));    

    try 
    { 
     proxy.Channel.StartWork(workload); 
     proxy.Dispose();     
    } 
    catch (EndpointNotFoundException ex) 
    { 
     logService.Error(ex);       
     proxy.Dispose(); 
     proxy = null; 
    } 
    catch (CommunicationException ex) 
    { 
     logService.Error(ex); 
     proxy.Dispose(); 
     proxy = null; 
    } 
    catch (TimeoutException ex) 
    { 
     logService.Error(ex);      
     proxy.Dispose(); 
     proxy = null; 
    } 
    catch (Exception ex) 
    { 
     logService.Error(ex);      
     proxy.Dispose(); 
     proxy = null; 
    }     

}) { IsBackground = true }; 

background.Start(); 

Tôi tiếp tục nhìn thấy các vấn đề thời gian chờ liên tục xảy ra mặc dù tôi đã đặt thời gian chờ để tối đa cho CloseTimeout, OpenTimeout, ReceiveTimeout, SendTimeout.

Tôi chỉ muốn đảm bảo thiết kế khôn ngoan đây không phải là vấn đề tức là mở một dịch vụ trên một chủ đề và xử lý nó?

EDIT:

Proxy nội bộ thiết lập kênh có gắn kết tùy chỉnh trên các điểm cuối khác nhau cho mỗi chuỗi.

+0

Đó là một chút bối rối mà bạn nói về "Dịch vụ", nơi tôi mong đợi "Proxy" (hoặc thậm chí "Khách hàng"), ví dụ "thread mở dịch vụ" nên là "thread mở một proxy cho dịch vụ của tôi", phải không? – Jeroen

+0

Xin lỗi, tôi vừa cập nhật câu hỏi, vì vậy về cơ bản dịch vụ của tôi đã mở nhưng có proxy chỉ gọi proxy.Channel.StartWork (khối lượng công việc); của dịch vụ cụ thể đó (đã được tự lưu trữ) - có ý nghĩa không? –

+0

bạn có thể muốn thêm 'final' vào mệnh đề try-catch của mình. cuối cùng thực hiện mã ngay cả khi một ngoại lệ được ném. Về vấn đề của bạn, tôi không chắc chắn. Tôi cũng tin rằng nó sẽ là khôn ngoan để vượt qua ràng buộc của bạn vào các nhà xây dựng. điều này có thể là nguyên nhân của ngoại lệ hết thời gian chờ của bạn. –

Trả lời

6

Tôi nghĩ rằng vấn đề có thể là bạn không đóng đúng proxy. Nếu bạn có rất nhiều chủ đề đánh máy chủ và họ không phải là tất cả làm sạch sau khi mình, bạn có thể nhận được một số thời gian chờ trên các kết nối.

Vứt bỏ không lý tưởng cho các kết nối đóng. Biết thêm thông tin ở đây: Disposing proxies

Các mô hình lý tưởng để sử dụng như sau:

try 
{ 
    proxy.Close(); 
} 
catch (Exception ex) 
{ 
    proxy.Abort(); 
} 
finally 
{ 
    proxy = null; 
} 

Bạn cố gắng để đóng kết nối, nếu nó không thành công, bạn hủy bỏ tất cả các kết nối. Vứt bỏ không hủy bỏ nếu có một ngoại lệ.

Như vậy, tôi sẽ cấu trúc lại như vậy:

var background = new Thread(() => 
{ 
    var proxy = new AssignmentSvcProxy(new EndpointAddress(worker.Address));    

    try 
    { 
     proxy.Channel.StartWork(workload); 
    } 
    catch (Exception ex) 
    { 
     // You aren't doing anything special with your specific exception types 
     logService.Error(ex);      
    }     
    finally 
    { 
     try 
     { 
      proxy.Close(); 
     } 
     catch (Exception ex) 
     { 
      proxy.Abort(); 
     } 
     finally 
     { 
      proxy = null; 
     } 
    } 

}) { IsBackground = true }; 

background.Start(); 
+1

Tính năng này hoạt động. Tuy nhiên, WCF proxy là chủ đề an toàn (các cuộc gọi đồng thời được tuần tự hóa). Kể từ khi tạo proxy và mở một kết nối mới đến máy chủ là một hoạt động tốn kém, thường proxy được sử dụng lại trên các luồng. –

+0

Tôi đồng ý, đó là lý do tại sao ông lý tưởng nên có một cơ chế thử lại trong trường hợp kết nối không thành công vì bất kỳ lý do gì. Mô hình này trong xử lý thất bại sau đó sẽ đảm bảo kết nối cũ được làm sạch trước khi bị buộc phải tạo một kết nối mới. – Bardia

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