2013-05-16 23 views
6

Hãy xem xét các đoạn mã sau:DoCallBack CrossAppDomainDelegate hành vi cho các đại biểu không tĩnh

// Create a new application domain 
AppDomain ad = AppDomain.CreateDomain("New domain"); 

Worker work = new Worker(); 

// if Worker class is marked as 'MarshalByRefObject', this will run in current 
// appdomain. 
// if Worker class is NOT marked as 'MarshalByRefObject' and is marked as 
// 'Serializable', this will run in a new appdomain. 
ad.DoCallBack(work.PrintDomain); 
// or ad.DoCallBack(new CrossAppDomainDelegate(work.PrintDomain)); 

// But for static methods: 
// If ppp method is static, no marking is required and it will run in 
// a new AppDomain. 
ad.DoCallBack(Worker.ppp); 

Làm thế nào để chúng tôi giải thích hành vi này của DoCallBack?

  1. Tại sao phương pháp không tĩnh PrintDomain thực hiện trong lĩnh vực hiện nay khi lớp Worker được đánh dấu MarshalByRefObject?
  2. Tại sao phương pháp không tĩnh PrintDomain được thực hiện trong một AppDomain mới khi lớp Worker được đánh dấu Serializable?
  3. Tại sao phương pháp tĩnh không cần bất kỳ dấu hiệu nào?

Trả lời

6

Tại sao phương thức không tĩnh PrintDomain được thực thi trong miền hiện tại khi lớp Công nhân được đánh dấu MarshalByRefObject?

Vì đó là những gì MBRO làm, nó tạo proxy cho đối tượng bạn đã tạo trong tên miền ứng dụng chính của mình. Những nguyên soái cuộc gọi từ appdomain phụ đến appdomain sở hữu đối tượng, appdomain chính.

Tại sao phương thức không tĩnh PrintDomain được thực thi trong một AppDomain mới khi lớp Worker được đánh dấu Serializable?

Do trường hợp đó không sử dụng proxy. Các đối tượng chính nó là marshaled từ tiểu học để appdomain thứ cấp. Có thể vì bạn đã đánh dấu nó [Serializable]. Cuộc gọi do đó thực hiện trong appdomain phụ.

Tại sao phương pháp tĩnh không cần bất kỳ dấu hiệu nào?

Không rõ ý bạn là gì bởi "dấu", nhưng không khác gì phương pháp tĩnh. Một số mã để chơi với, loại bỏ các bình luận trên lớp cơ sở để so sánh hai kịch bản:

using System; 

class Program { 
    static void Main(string[] args) { 
     var dom = AppDomain.CreateDomain("Test"); 
     var obj = new WorkerMbro(); 
     dom.DoCallBack(obj.PrintDomain); 
     dom.DoCallBack(obj.PrintDomainStatic); 
     Console.ReadLine(); 
    } 
} 
[Serializable] 
class WorkerMbro /* : MarshalByRefObject */ { 
    public void PrintDomain() { 
     Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); 
    } 
    public void PrintDomainStatic() { 
     Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); 
    } 
} 

Output như được đăng:

Test 
Test 

Output với nhận xét bị xóa vì proxy được sử dụng:

ConsoleApplication1.vshost.exe 
ConsoleApplication1.vshost.exe 
+1

Phương thức của bạn 'PrintDomainStatic' không tĩnh. Khi proxy được sử dụng ('MarshalByRefObject' uncommented) đầu ra là' ConsoleApplication1.vshost.exe Test' – Troopers

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