创建唯一的回调引用

时间:2014-05-09 17:32:59

标签: c# .net sdk

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

任何想法都非常感谢!

示例代码:

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

最后一部分client.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循环,只调用client.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));
                        }
                    });

1 个答案:

答案 0 :(得分:0)

回答OP的原始问题:

好的,所以我在过去的几个小时里玩了很多次,并且通过保持迭代循环但做了两件事使它成功了。首先,我假设第三方类将同步信息请求,并且不允许我的代码继续,直到它返回结果 - 这似乎不是这种情况,因为带有额外的Console.WriteLine(iterationCount)的递归输出显示计数增加而没有返回数据;因此我被迫通过Thread.Sleep减慢代码速度(我正在研究更好的方法)。其次,lambda中可以移到外面的任何代码都是。而是在lambda之外的temp bool被赋予结果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!
            }