创建唯一的回调引用
本文关键字:引用 回调 唯一 创建 | 更新日期: 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!
}