Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建唯一的回调引用_C#_.net_Sdk - Fatal编程技术网

C# 创建唯一的回调引用

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

所以问题如下:我使用第三方客户机类向外部系统发出命令来检索数据(相当标准)。问题是,当我通过该类的实例发出命令时,它会根据代码中的函数名和调用该类的函数中的行号使用回调引用,然后将此信息和其他信息序列化为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();
        }
    }
}

从OP的原始问题中删除的答案:


好的,在过去的几个小时里,我一直在玩这个,通过保持迭代循环,但做了两件事,使它工作起来;首先,我假设第三方类将同步信息请求,并且在返回结果之前不允许我的代码继续运行-这似乎不是实际情况,因为递归的输出带有一个额外的控制台;因此,我不得不通过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!
            }

如果没有一些代码来演示问题,这可能太抽象了,无法回答。等等,您使用的是什么版本的C#编译器?这可能是在闭包中访问
foreach
迭代器的众所周知的问题。Microsoft(R)Visual C#Compiler version 4.0.30319.18408 for Microsoft(R)。NET Framework 4.5I只是在临时用户持有foreach迭代器中的myUser的情况下进行了尝试,没有任何更改;还是一样的问题。谢谢乔尔,我也会调查的。我刚刚更新了我是如何让它工作的;这不漂亮!
           //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!
            }