我的服务器使用 MySqlConnector 并与 AWS 上的 MySQL 数据库进行通信。我在 MySQL 中存储了 5 分钟的 API 计数器块。这些 API 计数器随着每次 API 调用而递增,并由 ConcurrentDictionary 代码处理(这似乎不是问题)。这行代码最近引发了一个异常,它是通过 MySqlConnector 访问 MySQL 数据库表的 linq 查询的一部分:
await _context.ApiCounts.Where(c => c.ApiName == apiName && c.StartTime >= startTime).ToListAsync();
我以前从未见过此行失败,但突然我的一台服务器开始在上面的行中抛出以下异常:
InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct.
at System.ThrowHelper.ThrowInvalidOperationException_ConcurrentOperationsNotSupported
at System.Collections.Generic.Dictionary`2.FindEntry
at System.Collections.Generic.Dictionary`2.TryGetValue
at Remotion.Linq.Parsing.Structure.NodeTypeProviders.MethodInfoBasedNodeTypeRegistry.GetNodeType
at Remotion.Linq.Parsing.Structure.NodeTypeProviders.MethodInfoBasedNodeTypeRegistry.IsRegistered
at System.Linq.Enumerable.Any
at Remotion.Linq.Parsing.Structure.ExpressionTreeParser.GetQueryOperatorExpression
at …Run Code Online (Sandbox Code Playgroud) 我已经创建了一个自定义语言包,它扩展了ProjectPackage.我可以正确地创建新项目.我希望能够使用Add-> New Item ...(Ctrl + Shift + A)菜单项将新的源文件添加到项目中.但是,当我单击此时,可用模板列表为空.我想将自己的自定义模板添加到此项目类型的可用模板菜单中.是否有一些文件来完成这个?我见过的唯一提到的就是注册表黑客攻击,但我必须想办法以编程方式进行.
我可以覆盖一个特定的方法来填充列表吗?我是否真的需要制作模板,或者我可以只显示"模板名称","图标"并提供正确的文件扩展名(文件在创建时应该为空,所以我认为模板很大程度上浪费在我想要的东西上去做).
这是我到目前为止走过的路.我想我可以在我的自定义.vproj文件中设置我的项目类型和GUID(.vproj是我的自定义项目注册的文件扩展名).我以为我可以使用与我的.vproj文件相同的ProjectType快速创建项目模板.
<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Item">
<TemplateData>
<Icon>VerilogSource.ico</Icon>
<DefaultName>module.v</DefaultName>
<Name>Basic Verilog Module</Name>
<Description>
A basic Verilog module for quickly adding new files to the project.
</Description>
<ProjectType>VerilogProject</ProjectType>
</TemplateData>
<TemplateContent>
<ProjectItem TargetFileName="$fileinputname$.v"
ReplaceParameters="true">module.v</ProjectItem>
</TemplateContent>
</VSTemplate>
Run Code Online (Sandbox Code Playgroud)
唉,这个模板根本没有出现,即使我已经将它包含在VSIX中并将其复制到输出目录中.如果我将此模板放在与我的.vproj相同的文件夹中,它将显示为用于创建新项目的模板(错误!),但仍然不会出现在我的新项目列表中.这可能都源于我不使用VSTemplate来创建我的项目.相反,我使用[ProvideProjectFactoryAttribute]让VS2010知道我的vproj文件在哪里,并且它将使用vproj文件(我猜你可以调用模板,但它不是VSTemplate,它是一个项目)来建立新的项目.
这是我到目前为止所处的位置,我将继续尝试新事物.我希望有人可能有我想要的答案.谢谢,
Giawa
下午好,
我一直在研究一个可以使用CORBA与网络感知的应用程序通信的DLL.如果我将它作为C++控制台应用程序运行,代码工作正常.但是,我已经停止将方法导出为dll.这些方法似乎输出正常,如果我调用一个没有参数的方法,那么它按预期工作.我挂了把C#字符串传递给C++方法.
我的C++方法标题如下所示:
bool __declspec(dllexport) SpiceStart(char* installPath)
Run Code Online (Sandbox Code Playgroud)
我的C#DLL导入代码如下:
[DllImportAttribute("SchemSipc.dll", CharSet=CharSet.Ansi)]
private static extern bool SpiceStart(string installPath);
Run Code Online (Sandbox Code Playgroud)
我这样称呼方法:
bool success = SpiceStart(@"c:\sedatools");
Run Code Online (Sandbox Code Playgroud)
对SpiceStart的调用抛出异常"PInvokeStackImbalance","很可能是因为托管的PInvoke签名与非托管目标签名不匹配".
有没有人有什么建议?如果我从参数中删除char*和字符串,那么该方法运行正常.但是,我希望能够将应用程序的安装路径从C#传递给dll.
提前致谢,
Giawa