创建唯一的回调引用

本文关键字:引用 回调 唯一 创建 | 更新日期: 2023-09-27 18:02:40

问题如下:我使用第三方客户端类向外部系统发出命令以检索数据(相当标准)。问题是,当我通过这个类的实例发出命令时,它使用基于我代码中的函数名和调用它的函数中的行号的回调引用,然后它将此信息和其他信息序列化为JSON并传输到外部系统进行处理,数据返回由引用标识。这在迭代之前工作得"很好",然后回调引用保持不变,我只接收一次迭代的数据。第三方不打算改变他们的代码,所以我需要一种在我的代码中生成唯一引用的方法,但我不确定如何在c#中做到这一点。我不能编辑他们的类,因为它是作为DLL提供的,我只能通过使用它来访问这个系统(它是他们SDK的一部分)。

任何想法都非常感谢!

示例代码:

[注:实际代码是Windows窗体应用程序的一部分]

最后一部分客户端。IsUserInGroup是问题

using thirdParty.Client;
class TestProgram
{
    static void Main(string[] args)
    {
        //Area and user objects defined within third party class
        List<Area> Areas = new List<Area>();
        List<User> myUsers = new List<User>();
        int publicAreaID = 0;
        bool isConnected=false;
        client.Connect("user", "pass",
            (connstatus) =>
            {
                switch (connstatus)
                {
                    case ConnectionStatus.Success:
                        isConnected = true;
                        Console.WriteLine("Connected");
                        break;
                    case ConnectionStatus.InvalidCredentials:
                        Console.WriteLine("InvalidCredentials");
                        break;
                    case ConnectionStatus.Timeout:
                        Console.WriteLine("Timeout");
                        break;
                }
            });
        if (isConnected)
        {
            client.GetAreas(
                    (result) =>
                    {
                        Areas = result;
                    });
            //Get ID of public area
            foreach (Area myArea in Areas)
            {
                if (myArea.Name.Equals("Public"))
                {
                    publicAreaID = myArea.ID;
                }
            }
            //Get all keyholders in Public area and store in list
            client.GetUsersInArea(publicAreaID,
                (result) =>
                {
                    myUsers = result;
                });
            //Iterate over all users in list and verify they are in the everyone group
            foreach (User myUser in myUsers)
            {
                User tempUser = myUser;
                client.IsUserInGroup(tempUser.ID, 0,
                    (result) =>
                    {
                        if (result)  //this is a bool
                        {
                            //This only returns one result..
                            Console.WriteLine(String.Format("{0} is in Everyone Group and Public Area", tempUser.Name));
                        }
                    });
            }
            client.Disconnect();
        }
    }
}

我一直在做更多的测试,通过删除foreach循环,只是调用客户端。IsUserInGroup两次生成备用的回调引用;结果很有趣。正如预期的那样,有唯一的引用,但仍然只显示一个结果,获得这两个结果的唯一方法是创建两个User对象,而不是重用一个。如上所述,"真正的"代码是在Windows窗体应用程序中使用的,这可能与对象引用有关吗?示例代码如下:

new User tempUser1 = myUsers[0];
                client.IsUserInGroup(tempUser1.ID, 0,
                    (result) =>
                    {
                        if (result)  //this is a bool
                        {
                            Console.WriteLine(String.Format("{0} is in Everyone Group and Public Area", tempUser1.Name));
                        }
                    });
new User tempUser2 = myUsers[1];
                client.IsUserInGroup(tempUser2.ID, 0,
                    (result) =>
                    {
                        if (result)  //this is a bool
                        {
                            Console.WriteLine(String.Format("{0} is in Everyone Group and Public Area", tempUser2.Name));
                        }
                    });

创建唯一的回调引用

从OP最初的问题中移出答案:


在过去的几个小时里,我一直在玩这个并且通过保持迭代循环使它工作,但做两件事;首先,我假设第三方类将同步信息请求,并且不允许我的代码继续,直到它返回结果-这似乎不是这样,因为递归的输出带有额外的Console.WriteLine(iterationCount),其中显示计数增加而没有返回数据;因此,我被迫通过线程降低代码的速度。睡眠(我正在研究更好的方法)。其次,lambda中的任何代码都可以移到外部。相反,将结果bool值赋给lambda外部的一个临时bool值。代码如下所示:

           //Iterate over all users in list and verify they are in the everyone group
            foreach (User myUser in myUsers)
            {
                User tempUser = myUser;
                bool tempRes = false;
                client.IsUserInGroup(tempUser.ID, 0,
                    (result) =>
                    {
                        tempRes = result;
                    });
                if (tempRes)
                {
                    Console.WriteLine(String.Format("{0} is in Everyone Group and Public Area", tempUser.Name));
                }
                System.Threading.Thread.Sleep(75);  //Not a good way of enforcing sync!
            }