Diễn Đàn » Hướng Dẫn Lập trình

Kiểm soát thời gian sống của một đối tượng ở xa

0 trả lời, 413 lượt xem — Trang 1 / 1
Bạn muốn cấu hình thời gian sống của một đối tượng đơn-nhất hay được-client-kích-hoạt khi nó không còn được sử dụng.
Chỉ định các thiết lập mặc định về thời gian sống trong file cấu hình của host; chép đè phương thức InitializeLifetimeService trong lớp ở xa; hoặc hiện thực một cơ chế kiểm soát thời gian sống bên client.
Nếu một đối tượng sử dụng chế độ kích hoạt gọi một lần (single-call activation), nó sẽ tự động bị hủy vào cuối mỗi lời gọi phương thức. Điều này khác với các đối tượng được-client-kích-hoạt (client-activated) và đơn-nhất (singleton), các đối tượng này có thời gian sống lâu hơn vì tuân theo “lifetime lease” (tạm dịch là “hợp đồng cho thuê thời gian sống”). Với các thiết lập mặc định, một đối tượng ở xa sẽ tự động bị hủy nếu nó không hoạt động trong hai phút, miễn là nó đã tồn tại ít nhất năm phút.
Host, client, và lớp ở xa đều có thể thay đổi các thiết lập về thời gian sống:
·         Host có thể chỉ định các thiết lập mặc định về thời gian sống trong file cấu hình. Các thiết lập này sẽ áp dụng cho tất cả các đối tượng mà nó quản lý.
·         Client có thể gọi phương thức MarshalByRefObject.GetLifetimeService với một đối tượng ở xa cụ thể để thu lấy một thể hiện ILease. Kế tiếp, client có thể gọi phương thức ILease.Renew để chỉ định lượng thời gian tối thiểu mà đối tượng sẽ sống
·         Lớp ở xa có thể chép đè phương thức InitializeLifetimeService để điều chỉnh các thiết lập ban đầu về thời gian sống bằng đối tượng ILease.
Bạn có thể tạo một client định kỳ kiểm tra thời gian sống của một đối tượng ở xa.Ứng dụng này sử dụng một bộ định thời để liên tục kiểm tra các thiết lập ILease của đối tượng ở xa. Sử dụng ứng dụng này, bạn có thể truy xuất đối tượng thông qua mã lệnh (kể từ thời điểm này, thời gian sống của nó sẽ tự động được làm mới); hoặc bạn có thể làm mới thời gian sống của đối tượng bằng tay (nếu đối tượng ở xa còn sống ít nhất 5 phút, cách làm mới này sẽ không có tác dụng).                  
Phần mã lệnh cho client như sau:
Public Class ClientForm    Inherits System.Windows.Forms.Form    ' (Bỏ qua phần mã designer.)    Private RemoteObj As RemoteObjects.RemoteObject    Private Lease As System.Runtime.Remoting.Lifetime.ILease    Private Sub Form_Load(ByVal sender As System.Object, _      ByVal e As System.EventArgs) Handles MyBase.Load        RemotingConfiguration.Configure("SimpleClient.exe.config")        RemoteObj = New RemoteObjects.RemoteObject()        ' Khởi chạy timer để kiểm tra lease.        tmrCheckLease.Interval = 1000        tmrCheckLease.Start()        ' Thu lấy lease với thông tin về đối tượng ở xa.        ' Lease này thực sự được lưu giữ trong miền ứng dụng host.        ' Để giao tiếp với nó, bạn sử dụng Remoting và proxy.        Lease = RemoteObj.GetLifetimeService()    End Sub    Private Sub tmrCheckLease_Tick(ByVal sender As System.Object, _      ByVal e As System.EventArgs) Handles tmrCheckLease.Tick        ' Kiểm tra thông tin lease.        Try            ' Lease sẽ là Nothing nếu đối tượng ở xa đã chép đè            ' InitializeLifetimeService và tự cho thời gian sống vô hạn.            If Not (Lease Is Nothing) Then                lblLease.Text = "Current State: "                lblLease.Text &= Lease.CurrentState.ToString()                lblLease.Text &= vbNewLine                lblLease.Text &= "Initial Time Allocation: "                lblLease.Text &= Lease.InitialLeaseTime.ToString()                lblLease.Text &= vbNewLine                lblLease.Text &= "Time Remaining: "                lblLease.Text &= Lease.CurrentLeaseTime.ToString()            End If        Catch err As RemotingException            ' Lỗi xảy ra nếu đối tượng không còn sống.            lblLease.Text = err.ToString()            tmrCheckLease.Stop()        End Try    End Sub    Private Sub cmdRenew_Click(ByVal sender As System.Object, _      ByVal e As System.EventArgs) Handles cmdRenew.Click        ' Cho đối tượng ở xa có thời gian sống là 5 phút.        Lease.Renew(TimeSpan.FromMinutes(5))    End Sub    Private Sub cmdAccess_Click(ByVal sender As System.Object, _      ByVal e As System.EventArgs) Handles cmdAccess.Click        ' Khi phương thức này được gọi, thời gian sống của đối tượng         ' tự động được làm mới dựa vào các thiết lập mặc định.        Dim Test As String = RemoteObj.GetLocation()    End SubEnd Class
Một cách khác để cấu hình thời gian sống là thông qua file cấu hình của host với thẻ <lifetime>. Các thiết lập này áp dụng cho tất cả các đối tượng ở xa do host tạo ra. Sử dụng M để chỉ phút và S để chỉ giây.
Ví dụ dưới đây cho đối tượng ở xa có thời gian sống ban đầu là 10 phút. Khi một client truy xuất đối tượng, thời gian sống của nó tự động được làm mới ít nhất ba phút.
<configuration>  <system.runtime.remoting>    <application>      <service>         <wellknown             mode = "Singleton"             type="RemoteObjects.RemoteObject, RemoteObjects"             objectUri="RemoteObject" />      </service>      <channels>        <channel ref="tcp" port="9080" />      </channels>      <lifetime leaseTime = "10M"                renewOnCallTime = "3M" />    </application>  </system.runtime.remoting></configuration>
Cuối cùng, một đối tượng ở xa có thể chép đè InitializeLifetimeService để tự kiểm soát thời gian sống của nó. Trường hợp thông thường nhất là bạn muốn tạo một đối tượng đơn-nhất chạy độc lập (và lâu dài), cả khi client không sử dụng nó.
Bạn có thể thêm đoạn mã dưới đây vào lớp ở xa để nó có thời gian sống mặc định là 10 phút và thời gian làm mới là 5 phút. Nếu muốn đối tượng có thời gian sống vô hạn, bạn chỉ cần trả về một tham chiếu rỗng (Nothing) thay vì là đối tượng ILease.
Public Overrides Function InitializeLifetimeService() As Object    Dim Lease As ILease = MyBase.InitializeLifetimeService()    ' Lease chỉ có thể được cấu hình nếu nó đang ở trạng thái ban đầu.    If Lease.CurrentState = LeaseState.Initial Then        Lease.InitialLeaseTime = TimeSpan.FromMinutes(10)        Lease.RenewOnCallTime = TimeSpan.FromMinutes(5)    End If    Return LeaseEnd Function
 
Trích từ “Các giải pháp lập trình Visual Basic .Net (tập 2)”
Đăng nhập để trả lời
0