gpt4 book ai didi

c# - ASP.NET C# 外部 SDK 不是线程安全的

转载 作者:行者123 更新时间:2023-11-30 17:25:10 24 4
gpt4 key购买 nike

我在 ASP.NET/C# 中有一个 Web API。

它使用外部 32 位 ActiveX SDK 与第三方应用程序通信。

根据我的测试,当我们同时连接两个不同的用户时,该 SDK 会出现问题。第二个连接覆盖第一个。

如果我在两个 cURL 循环中调用我的 API,一个与 userA 连接,另一个与 userB 连接,在某些情况下,对 userA 的调用将得到 userB 的结果。

我的代码中没有任何静态变量,肯定没有引用 SDK。

我能想到的唯一解决方案是在获取用户响应时“锁定”API。还有其他解决方案吗?如果没有,关于如何在 C# 中执行此操作的任何指示?

API 有多个 Controller (想想客户/发票/付款/供应商),所有这些都使用相同的 SDK。因此,对 CustomerController 方法的调用也必须锁定对其他 Controller 的调用。

锁只需要在我使用 SDK 时处于事件状态(这可能是请求时间的 99%)。

编辑 1:

SDK名为“Interop.AcoSDK.dll”,是32位的。 Visual Studio 将该文件描述为“AcoSDK 库”。它是用于会计程序 Acomba 的 SDK。该程序本身的结构非常古老,其起源可追溯到80年代的DOS(当时该程序名为Fortune1000)。与 SDK 的交互确实不现代。

我已将 DLL 添加到我的项目中,为了使用它,我调用了两个部分。


AcoSDKX AcoSDK = new AcoSDKX();
int version = AcoSDK.VaVersionSDK;
if (AcoSDK.Start(version) != 0)
{
throw new Exception("Failed to start SDK");
}

cie = new AcombaX();
if (cie.CompanyExists(config.ciePath) == 0)
{
throw new Exception("Company not found");
}

int error = cie.OpenCompany(config.appPath, config.ciePath);
if (error != 0)
{
throw new Exception("Failed to open company: " + cie.GetErrorMessage(error));
}

AcoSDK.User User = new AcoSDK.User
{
PKey_UsNumber = config.user
};

try
{
error = User.FindKey(1, false);
}
catch
{
throw new Exception("Failed to find user");
}

if (error != 0)
{
throw new Exception("Failed to find user");
}

error = cie.LogCurrentUser(User.Key_UsCardPos, config.pass);
if (error != 0)
{
throw new Exception("Failed to login in Acomba: " + cie.GetErrorMessage(error));
}

上面的cie属性是类中的一个private AcombaX cie

从我的其他类调用该类来处理与 SDK 的连接。

我的其他类将其声明为标准对象(非静态)。

上面的config 指的是一个对象,该对象具有API 请求所针对的公司/用户的属性。可以调用多家公司的电话。

目前,我的问题是调用不同的公司时,数据最终会混淆。因此,来自公司 B 的值将显示在我对公司 A 的查询中,例如,当我同时向两家公司循环调用 cURL 中的 API 100 次时。对于某些查询,它不会每次都这样做,只是在某些时候这样做。可能是当一个调用打开公司 B 的 SDK 而公司 A 的调用已经连接到 SDK 但还没有开始请求数据时。

最佳答案

您需要分享更多有关 ActiveX SDK 的信息(实际上没有这样的东西)。 ActiveX的三种类型

( great explanation here )

ActiveX EXE: Unlike a stand-alone EXE file, an ActiveX EXE file is designed to work as an OLE server, which is nothing more than a program designed to share information with another program. It has an .EXE file extension.

ActiveX DLL: ActiveX DLL files are not meant to be used by themselves. Instead, these types of files contain subprograms designed to function as building blocks when creating a stand-alone program. It has a .DLL file extension.

ActiveX Control: Unlike an ActiveX DLL or ActiveX EXE file, an ActiveX Control file usually provides both subprograms and a user interface that you can reuse in other programs. It has an .OCX file extension.

根据 SDK 的格式及其使用方式,可能存在使调用并行的解决方案。

用一些代码、示例等更新问题,可能会让我了解更多。

这可能是启动多个应用程序而不是一个应用程序并将它们用作池,从同一个库创建多个对象等等。

关于c# - ASP.NET C# 外部 SDK 不是线程安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59220326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com