3

在一个线程中,一个文件被不断地打开、关闭和处理。这会引起问题吗?

这是代码

 StreamWriter file1 = new StreamWriter(filepath4, true);
                        for (int i = 0; i < ChannelValueForTcp; i++)
                        {
                            file1.WriteLine(data[i]);
                        }
                                file1.WriteLine(data[data.Length-1]);
                                file1.WriteLine(data[data.Length - 2]);
                                file1.Close();
                                file1.Dispose();

在此处输入图像描述

请帮助我卡住了。(这是随机出现的,我们试图连续运行代码 8 小时。)

编辑:

没有其他线程工作或做任何与此文件相关的事情。它只在这里使用。还有其他线程正在运行,它们给出了相同的错误,但在 45 分钟 - 5 小时的测试后随机出现。

这是c代码。请下载

[DllImport("ConsoleApplication2.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int main_c();

 public string[] tcp(string peer, int port)
        {

            int i = main_c();//the c code writes to a file called akash.txt and returns = 0 if it is successful. Then I read the file and do some functions on it. 

 if (i == 0)
            {
                StreamReader objReader = new StreamReader("akash.txt");
4

1 回答 1

2

随机崩溃和 FatalExecutionEngineError 异常通常与堆栈或堆损坏相关联,这些损坏可能会一直隐藏到代码中的更下方。确保使用正确的调用约定、参数类型和返回类型正确编组了所有 C++ 函数。

Microsoft 指定消息的可能原因是:

CLR 已被严重损坏。这通常是由数据损坏引起的,这可能是由许多问题引起的,例如对格式错误的平台调用函数的调用以及将无效数据传递给 CLR。

从您提供的代码来看,您的声明看起来是正确的,因此可能是您编组的另一个函数导致了问题。

确保您的 C++ 代码是稳定的,而不是问题的原因。我认为这可能与“res”缓冲区的删除或填充有关。

您可以使用一个标志来编译 DLL,该标志将调用约定设置为与 __cdecl 不同的东西。您可以通过右键单击项目 > 属性 > C/C++ > 高级 > 调用约定来验证这一点。

于 2013-07-06T12:02:22.807 回答