Cuộc gọi lại là gì?


139

Gọi lại là gì và nó được triển khai như thế nào trong C #?


Bạn đang đề cập đến các cuộc gọi lại ASP.Net hoặc các tham số gọi lại ủy nhiệm?
SLaks

8
Nó có thể có nghĩa là một số điều - trong bối cảnh bạn đã nghe nó?
UpTheCux

1
Tôi nghĩ anh ấy đang nói về một Async. Gọi lại
George Johnston

8
-1 Câu hỏi không rõ ràng (không đủ chi tiết).
serhio

1
Bạn nên hỏi google cho những câu hỏi dứt khoát.
Ozgur Dogus

Câu trả lời:


123

Trong lập trình máy tính , một cuộc gọi lại là mã thực thi được truyền dưới dạng đối số cho mã khác.

- Wikipedia: Gọi lại (khoa học máy tính)

C # có đại biểu cho mục đích đó. Chúng được sử dụng nhiều với các sự kiện , vì một sự kiện có thể tự động gọi một số đại biểu đính kèm (xử lý sự kiện).


10
trên thực tế, một cuộc gọi lại là một con trỏ tới mã thực thi được chuyển qua làm đối số cho mã khác ... trang cần được xem xét
Gianluca Ghettini

8
@G_G: Không có gì nói rằng nó phải là một con trỏ. Nó thường là do phân đoạn dữ liệu không thể thực thi được, nhưng về mặt kỹ thuật đó là một chi tiết triển khai.
Joey

Joey: bạn đúng đó là một chi tiết triển khai nhưng ngay cả cuộc gọi lại cũng là chi tiết triển khai. Bạn có thể viết lại mã của mình mà không cần gọi lại một lần. Nó giống như "trong khi" so với "cho".
Gianluca Ghettini

1053

Tôi vừa mới gặp bạn,
Và điều này thật điên rồ,
Nhưng đây là số của tôi (đại biểu),
vậy nếu có chuyện gì xảy ra (sự kiện), hãy
gọi cho tôi, có thể (gọi lại)?


33
Hoàn toàn giải thích mát mẻ. Tôi sẽ sử dụng lời giải thích này bất cứ khi nào ai đó hỏi, hy vọng tôi có thể có quyền sử dụng nó?
Nikola Davidovic

15
+1: Yêu nó. Nó phá hỏng bài hát, nhưng nó sẽ đọc 'Nhưng đây là số của tôi và hướng dẫn sử dụng một loại điện thoại cụ thể (đại biểu)'
Mã hóa

8
Tìm hiểu đại biểu với Nụ cười trên khuôn mặt của bạn :-)
Aakash

8
Giải thích tốt nhất bao giờ hết!
zhengtonic

3
Lưu ý rằng việc giảng dạy cho người khác với lời giải thích đó chỉ hoạt động với một vũ đạo tốt :)
Sébastien Sevrin

87

Gọi lại là một chức năng sẽ được gọi khi một quá trình được thực hiện thực hiện một nhiệm vụ cụ thể.

Việc sử dụng một cuộc gọi lại thường là trong logic không đồng bộ.

Để tạo một cuộc gọi lại trong C #, bạn cần lưu trữ một địa chỉ hàm bên trong một biến. Điều này đạt được bằng cách sử dụng một delegatehoặc ngữ nghĩa lambda mới Funchoặc Action.

    public delegate void WorkCompletedCallBack(string result);

    public void DoWork(WorkCompletedCallBack callback)
    {
        callback("Hello world");
    }

    public void Test()
    {
        WorkCompletedCallBack callback = TestCallBack; // Notice that I am referencing a method without its parameter
        DoWork(callback);
    }

    public void TestCallBack(string result)
    {
        Console.WriteLine(result);
    }

Trong C # ngày nay, điều này có thể được thực hiện bằng lambda như:

    public void DoWork(Action<string> callback)
    {
        callback("Hello world");
    }

    public void Test()
    {
        DoWork((result) => Console.WriteLine(result));
    }

49

Định nghĩa

Một cuộc gọi lại là mã thực thi được truyền dưới dạng đối số cho mã khác.

Thực hiện

// Parent can Read
public class Parent
{
    public string Read(){ /*reads here*/ };
}

// Child need Info
public class Child
{
    private string information;
    // declare a Delegate
    delegate string GetInfo();
    // use an instance of the declared Delegate
    public GetInfo GetMeInformation;

    public void ObtainInfo()
    {
        // Child will use the Parent capabilities via the Delegate
        information = GetMeInformation();
    }
}

Sử dụng

Parent Peter = new Parent();
Child Johny = new Child();

// Tell Johny from where to obtain info
Johny.GetMeInformation = Peter.Read;

Johny.ObtainInfo(); // here Johny 'asks' Peter to read

Liên kết


2
chào @serhio cảm ơn bạn đã trả lời. đối với tôi vẫn còn một chút âm u: chính xác thì mã được chuyển làm đối số cho mã khác Có vẻ như là thêm phương thức Peter.Read cho đại biểu của đứa trẻ?
BKSpurgeon

1
@serhio liên kết đã chết.
Giu-đa

10

Một cuộc gọi lại là một con trỏ hàm mà bạn chuyển đến một chức năng khác. Hàm bạn đang gọi sẽ 'gọi lại' (thực thi) chức năng khác khi nó đã hoàn thành.

Kiểm tra liên kết này .


2
Một cuộc gọi lại có thể được thực hiện như là một đại biểu cho một phương thức, nhưng bạn cũng có thể nói rằng việc truyền một đối tượng hỗ trợ phương thức gọi lại trên giao diện của nó là một cuộc gọi lại.
Joe

Array.Sort (mảngObject); gọi obj.CompareTo (AnotherObj) trên các phần tử của mảngObject là một ví dụ cổ điển về gọi lại bằng Giao diện (IComparizable) trong .Net.
Ron5504

8

Nếu bạn đề cập đến các cuộc gọi lại ASP.Net:

Trong mô hình mặc định cho các trang Web ASP.NET, người dùng tương tác với một trang và nhấp vào nút hoặc thực hiện một số hành động khác dẫn đến hậu quả. Trang và các điều khiển của nó được tạo lại, mã trang chạy trên máy chủ và một phiên bản mới của trang được hiển thị cho trình duyệt. Tuy nhiên, trong một số trường hợp, rất hữu ích khi chạy mã máy chủ từ máy khách mà không thực hiện việc gửi lại. Nếu tập lệnh máy khách trong trang đang duy trì một số thông tin trạng thái (ví dụ: giá trị biến cục bộ), đăng trang và nhận bản sao mới của nó sẽ phá hủy trạng thái đó. Ngoài ra, postback trang giới thiệu chi phí xử lý có thể làm giảm hiệu suất và buộc người dùng phải chờ trang được xử lý và tạo lại.

Để tránh mất trạng thái máy khách và không phải chịu chi phí xử lý của máy chủ khứ hồi, bạn có thể mã hóa trang web ASP.NET để nó có thể thực hiện các cuộc gọi lại máy khách. Trong một cuộc gọi lại máy khách, một chức năng kịch bản lệnh máy khách sẽ gửi một yêu cầu đến một trang web ASP.NET. Trang web chạy phiên bản sửa đổi của vòng đời bình thường. Trang được bắt đầu và các điều khiển của nó và các thành viên khác được tạo, và sau đó một phương thức được đánh dấu đặc biệt được gọi. Phương thức thực hiện việc xử lý mà bạn đã mã hóa và sau đó trả về một giá trị cho trình duyệt có thể được đọc bởi một hàm script khách hàng khác. Trong suốt quá trình này, trang này nằm trong trình duyệt.

Nguồn: http://msdn.microsoft.com/en-us/l Library / ms178208.aspx

Nếu bạn đang đề cập đến các cuộc gọi lại trong mã:

Các cuộc gọi lại thường được ủy quyền cho các phương thức được gọi khi hoạt động cụ thể đã hoàn thành hoặc thực hiện một hành động phụ. Bạn sẽ thường tìm thấy chúng trong các hoạt động không đồng bộ. Đó là một nguyên tắc lập trình mà bạn có thể tìm thấy trong hầu hết mọi ngôn ngữ mã hóa.

Thêm thông tin ở đây: http://msdn.microsoft.com/en-us/l Library / ms173172.aspx


4

Cống hiến cho LightStriker:
Mã mẫu:

class CallBackExample
{
    public delegate void MyNumber();
    public static void CallMeBack()
    {
        Console.WriteLine("He/She is calling you.  Pick your phone!:)");
        Console.Read();
    }
    public static void MetYourCrush(MyNumber number)
    {
        int j;
        Console.WriteLine("is she/he interested 0/1?:");
        var i = Console.ReadLine();
        if (int.TryParse(i, out j))
        {
            var interested = (j == 0) ? false : true;
            if (interested)//event
            {
                //call his/her number
                number();
            }
            else
            {
                Console.WriteLine("Nothing happened! :(");
                Console.Read();
            }
        }
    }
    static void Main(string[] args)
    {
        MyNumber number = Program.CallMeBack;
        Console.WriteLine("You have just met your crush and given your number");
        MetYourCrush(number);
        Console.Read();
        Console.Read();
    }       
}

Giải thích mã:

Tôi đã tạo mã để thực hiện lời giải thích hài hước do LightStriker cung cấp trong một trong những câu trả lời ở trên. Chúng tôi đang chuyển đại biểu (số) cho một phương thức ( MetYourCrush). Nếu sự quan tâm (sự kiện) xảy ra trong phương thức ( MetYourCrush) thì nó sẽ gọi đại biểu (số) đang giữ tham chiếu của CallMeBackphương thức. Vì vậy, CallMeBackphương thức sẽ được gọi. Về cơ bản, chúng tôi đang thông qua đại biểu để gọi phương thức gọi lại.

Hãy cho tôi biết nếu bạn có bất cứ thắc mắc nào.


Điều này không trả lời thỏa đáng cho câu hỏi, bạn có thể giải thích mã của bạn đang làm gì không, để mô tả cách thức gọi lại hoạt động và cách triển khai trong C #.
Adam

Xin chào Adam, Cảm ơn bạn đã trả lời. Tôi đã tạo mã để thực hiện lời giải thích hài hước do LightStriker cung cấp. Chúng tôi đang chuyển đại biểu (số) cho một phương thức (MetYourCrush). Nếu sự quan tâm (sự kiện) xảy ra trong phương thức (MetYourCrush) thì nó sẽ gọi đại biểu (số) đang giữ tham chiếu của phương thức CallMeBack. Vì vậy, phương thức CallMeBack sẽ được gọi. Về cơ bản, chúng tôi đang thông qua đại biểu để gọi phương thức gọi lại. Hãy cho tôi biết nếu bạn có bất cứ thắc mắc nào.
Mani

1

Có lẽ không phải là định nghĩa từ điển, nhưng một cuộc gọi lại thường đề cập đến một chức năng, bên ngoài một đối tượng cụ thể, được lưu trữ và sau đó được gọi theo một sự kiện cụ thể.

Một ví dụ có thể là khi nút UI được tạo, nó lưu tham chiếu đến một chức năng thực hiện một hành động. Hành động được xử lý bởi một phần khác của mã nhưng khi nhấn nút, cuộc gọi lại được gọi và điều này gọi hành động để thực hiện.

C #, thay vì sử dụng thuật ngữ 'gọi lại' sử dụng 'sự kiện' và 'đại biểu' và bạn có thể tìm hiểu thêm về các đại biểu tại đây .


0

Một cuộc gọi lại cho phép bạn chuyển mã thực thi làm đối số cho mã khác. Trong C và C ++, điều này được thực hiện như một con trỏ hàm. Trong .NET, bạn sẽ sử dụng một ủy nhiệm để quản lý các con trỏ hàm.

Một vài cách sử dụng bao gồm báo hiệu lỗi và kiểm soát xem một chức năng có hoạt động hay không.

Wikipedia


0

các bước làm việc gọi lại:

1) chúng ta phải thực hiện ICallbackEventHandlerGiao diện

2) Đăng ký tập lệnh máy khách:

 String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
    String callbackScript = "function UseCallBack(arg, context)" + "{ " + cbReference + ";}";
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "UseCallBack", callbackScript, true);

1) từ cuộc gọi UI Onclient bấm vào chức năng gọi javascript cho EX: - builpopup(p1,p2,p3...)

var Finalfield = p1, p2, p3; UseCallBack(finalfield, ""); dữ liệu từ máy khách được chuyển đến phía máy chủ bằng cách sử dụng UseCallBack

2) public void RaiseCallbackEvent(string eventArgument) Trong eventArgument, chúng tôi nhận được dữ liệu đã truyền // thực hiện một số thao tác phía máy chủ và được chuyển đến "callbackResult"

3) GetCallbackResult() // sử dụng phương thức này, dữ liệu sẽ được chuyển đến phía máy khách (hàm receiveServerData ())

gọi lại

4) Nhận dữ liệu ở phía máy khách : ReceiveServerData(text) , trong phản hồi của máy chủ văn bản, chúng tôi sẽ nhận được.


0

Các đại biểu thực hiện tương tự như các cuộc gọi lại dựa trên giao diện trong C ++ (COM sử dụng các lệnh này), mặc dù sử dụng đơn giản hơn nhiều.

Lưu ý rằng Microsoft đưa các đại biểu vào triển khai Java (J ++) nhưng Sun không thích họ [java.sun.com] vì vậy đừng mong đợi được gặp họ trong phiên bản chính thức của Java bất cứ lúc nào. Tôi đã hack cùng một bộ tiền xử lý để cho phép bạn sử dụng chúng trong C ++, vì vậy đừng cảm thấy bị bỏ rơi nếu bạn không lập trình trong C # hoặc trên nền tảng .NET (tức là trong Managed C ++ hoặc Visual Basic.NET).

Nếu bạn đã sử dụng chức năng con trỏ trong C, đại biểu về cơ bản là một cặp con trỏ được cuộn thành một:

  • Một con trỏ tới một đối tượng (tùy chọn)
  • Một con trỏ tới một phương thức của đối tượng đó

Điều đó có nghĩa là một đại biểu duy nhất chuyển tất cả thông tin cần thiết để định vị một chức năng trong chương trình của bạn, cho dù đó là phương thức tĩnh hay được liên kết với một đối tượng.

Bạn định nghĩa chúng như thế này trong C #:

public delegate void FooCallbackType( int a, int b, int c );

Khi bạn muốn sử dụng chúng, bạn thực hiện ủy nhiệm ngoài chức năng bạn muốn gọi:

class CMyClass
{
    public void FunctionToCall( int a, int b, int c )
    {
        // This is the callback
    }

    public void Foo()
    {
        FooCallbackType myDelegate = new FooCallbackType(
            this.FunctionToCall );
        // Now you can pass that to the function
        // that needs to call you back.
    }
}

Nếu bạn muốn tạo một đại biểu để trỏ đến một phương thức tĩnh, nó chỉ trông giống như sau:

class CMyClassWithStaticCallback
{
    public static void StaticFunctionToCall( int a, int b, int c )
    {
        // This is the callback
    }

    public static void Foo()
    {
        FooCallbackType myDelegate = new FooCallbackType(
            CMyClass.StaticFunctionToCall );
    }
}

Nói chung, chúng thực hiện tương tự như các cuộc gọi lại dựa trên giao diện trong C ++, nhưng gây ra một chút rắc rối vì bạn không cần phải lo lắng về việc đặt tên các chức năng của mình hoặc tạo các đối tượng trợ giúp và bạn có thể tạo ra các đại biểu từ bất kỳ phương thức nào. Chúng linh hoạt hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.