2010-04-13 4 views
5

Tôi bắt đầu mã hóa trong C# và chưa bao giờ có cơ hội sử dụng các cuộc gọi lại mặc dù tôi đã sử dụng các đại biểu cho kết nối sự kiện. Ứng dụng thực sự của callbacks là gì. Tôi sẽ biết ơn nếu bạn có thể cung cấp cho một số liên kết giải thích về callbacks một cách thẳng về phía trước mà không cần điều kiện tiên quyết C++.Gọi lại trong C#

+0

Câu trả lời của tôi dưới đây có giúp bạn không? Nếu có, vui lòng đánh dấu nó là câu trả lời. Cảm ơn. – gehho

+0

Xin chào Daniel, Bạn có thể chọn câu trả lời và đánh dấu câu trả lời đó không. –

Trả lời

9

Gọi lại thực sự là đại biểu, tức là tham chiếu đến một hàm. Các callbacks thường được sử dụng trong các tình huống không đồng bộ (multi-threaded) để thông báo cho người gọi khi hoạt động không đồng bộ kết thúc: Phương thức không đồng bộ nhận một callback/delegate làm tham số và gọi đại biểu này sau khi nó hoàn thành công việc của nó, tức là nó quay lại ". Sử dụng callbacks/delegate cho phép người gọi quyết định hoạt động nào được gọi bởi vì anh ta truyền vào các tham số.

Ví dụ:
Khi người dùng bắt đầu một hoạt động dài chạy bằng cách bấm vào một nút, bạn có thể đặt con trỏ chuột đến một WaitCursor và bắt đầu các hoạt động chạy dài trên thread khác. Bây giờ, làm thế nào để bạn biết khi nào bạn có thể thiết lập lại con trỏ chuột đến ArrowCursor bình thường? Trả lời: sử dụng Callbacks. Bạn chỉ cần tạo một phương thức đặt lại con trỏ thành một mũi tên và sau đó chuyển tham chiếu đến phương thức này (một đại biểu) làm tham số gọi lại. Sau đó, phương thức này được gọi khi hoạt động kết thúc và con trỏ của bạn được đặt lại.

Thực ra, các sự kiện cũng là một số loại gọi lại: bạn đăng ký một đại biểu để được thông báo khi một sự kiện nào đó xảy ra. Khi sự kiện này xảy ra, bạn là được gọi lại bằng cách sử dụng đại biểu được cung cấp.

1

Bất kỳ hành động không đồng bộ nào đều sẽ dựa vào gọi lại.

1

Gọi lại là đại biểu là con trỏ hàm. Tôi không nghĩ rằng đề tài là một điều kiện tiên quyết cho callbacks.

0

Chúng được sử dụng để nắm bắt kết quả của một hành động không đồng bộ.

1

Nếu bạn đã quen với WPF, một ví dụ hay là Thuộc tính phụ thuộc. Bạn đăng ký sau đó sử dụng DependencyProperty.Register:

public static DependencyProperty Register(
    string name, 
    Type propertyType, 
    Type ownerType, 
    PropertyMetadata typeMetadata, 
    ValidateValueCallback validateValueCallback 
) 

Khi tham số cuối cùng, bạn vượt qua một chức năng của bạn đó được gọi là bởi khuôn khổ khi một số công việc cần phải được thực hiện (chứng thực giá trị).

0

Đại biểu giữ tham chiếu đến một phương pháp khiến ứng viên trở thành ứng viên lý tưởng cho gọi lại.

Tôi đã cố gắng giải thích nó bằng một ví dụ đơn giản: Các hoạt động của lớp thiền giống như một máy chủ trò chuyện nơi bộ điều khiển có thể đăng nhập. Để giao tiếp, Bộ điều khiển cần triển khai phương thức sẽ hoạt động như phương thức gọi lại.

public class Mediator 
    { 
     //instruct the robot to move. 
     public delegate void Callback(string sender, string receiver, Message msg); 


     Callback sendMessage; 

     //Assign the callback method to the delegate   
     public void SignOn(Callback moveMethod) 
     { 
      sendMessage += moveMethod; 
     } 

     public void SendMessage(string sender, string receiver, string msg) 
     { 
      sendMessage(sender, receiver, msg); 
     } 
    } 


public class Controller : Asset 
    { 
     string readonly _name; 
     Mediator _mediator; 
     public Controller(Mediator m, string name) 
     { 
       _name = name; 
      _mediator = m; 
      //assign the call back method 
      _mediator.SignOn(Notification); 
     } 

     public void Notification(string sender, string receiver, string msg) 
     { 
      if (receiver == _name) 
      { 
       Console.WriteLine("{0}: Message for {1} - {2}".FormateText(sender, 
       receiver, msg)); //I have create extension method for FormatText. 
      } 
     } 

     public void Mobilize(string receiver, string msg) 
     { 
       _mediator.SendMessage(_name, receiver, msg); 
     } 

    } 

static void Main(string[] args) 
{ 

    Mediator mediator; 
    mediator = new Mediator(); 

    //accept name here... 

    Controller controller1 = new Controller(mediator, "name1"); 
    Controller controller2 = new Controller(mediator, "name2"); 
    controller1.Mobilize("name2","Hello"); 
    controller1.Mobilize("name1", "How are you?"); 
} 

output will be: 

name1: Message for name2 - Hello 
name2: Message for name1 - How are you?