C# 创建唯一的回调引用
所以问题如下:我使用第三方客户机类向外部系统发出命令来检索数据(相当标准)。问题是,当我通过该类的实例发出命令时,它会根据代码中的函数名和调用该类的函数中的行号使用回调引用,然后将此信息和其他信息序列化为JSON并传输到外部系统进行处理,数据返回由引用标识。在我们进行迭代之前,这是“很好”的,然后回调引用保持不变,我只接收一次迭代的数据。第三方不会修改他们的代码,所以我需要一种在代码中生成唯一引用的方法,但我不确定如何在C#中实现这一点。我不能编辑他们的类,因为它是作为DLL提供的,我只能使用它访问这个系统(它是他们SDK的一部分) 非常感谢您的任何想法 示例代码: [注意:实际代码是Windows窗体应用程序的一部分] 最后一部分client.IsUserInGroup就是问题所在C# 创建唯一的回调引用,c#,.net,sdk,C#,.net,Sdk,所以问题如下:我使用第三方客户机类向外部系统发出命令来检索数据(相当标准)。问题是,当我通过该类的实例发出命令时,它会根据代码中的函数名和调用该类的函数中的行号使用回调引用,然后将此信息和其他信息序列化为JSON并传输到外部系统进行处理,数据返回由引用标识。在我们进行迭代之前,这是“很好”的,然后回调引用保持不变,我只接收一次迭代的数据。第三方不会修改他们的代码,所以我需要一种在代码中生成唯一引用的方法,但我不确定如何在C#中实现这一点。我不能编辑他们的类,因为它是作为DLL提供的,我只能使用它
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!
}