【问题标题】:Strange dispose behavior while testing测试时奇怪的处置行为
【发布时间】:2022-01-07 05:39:59
【问题描述】:

我有使用其他 2 个端点的处理程序的端点,这可能不是最佳实践,但这不是重点。在这种方法中,我使用了很多 MemoryStreams、ZipStream 和类似的东西。当然,我将它们全部处理掉。一切正常,直到我一起运行所有测试,然后测试抛出错误,例如:“输入字符串的格式不正确。”、“无法读取 Zip 文件”或其他奇怪的消息。这也是我在之前的测试中使用的这 2 个处理程序的测试。 我发现的解决方案是添加“Thread.Sleep(1);”在“Handle”方法的最后,就在返回之前。看起来有些东西需要更多时间来处理,但为什么呢?你知道为什么这个 1ms 睡眠有助于解决这个问题吗?

ExtractFilesFromZipAndWriteToGivenZipArchive 是一个异步方法。

public async Task<MemoryStream> Handle(MultipleTypesExportQuery request, CancellationToken cancellationToken)
    {
        var stepwiseData = await HandleStepwise(request.RainmeterId, request.StepwiseQueries, cancellationToken); 
        var periodicData = await HandlePeriodic(request.RainmeterId, request.PeriodicQueries, cancellationToken);
        
        var data = new List<MemoryStream>();
        data.AddRange(stepwiseData);
        data.AddRange(periodicData);

        await using (var ms = new MemoryStream())
        using (var archive = new ZipArchive(ms, ZipArchiveMode.Create,false))
        {
            int i = 0;
            foreach (var d in data)
            {
                d.Open();
                d.Position = 0;
                
                var file = ZipFile.Read(d);
                
                ExtractFilesFromZipAndWriteToGivenZipArchive(file, archive, i, cancellationToken);
                
                i++;
                file.Dispose();
                d.Dispose();
            }
            //Thread.Sleep(100);
            return ms;
        }
    }

【问题讨论】:

  • ExtractFilesFromZipAndWriteToGivenZipArchive() 是异步的吗?
  • 发布实际的完整异常。使用using 块来确保正确处理流。这段代码中没有任何与 CQRS 相关的内容。您未发布的代码中可能会出现错误。当您尝试使用错误的格式或语言环境解析字符串时,会抛出 Input string was not in a correct format.。您发布的代码不解析字符串,因此其他方法之一失败
  • 如果问题通过添加延迟而停止,这意味着 您的代码 不是线程安全的并且受到竞争条件的影响。完整的异常(Exception.ToString() 返回的字符串)和实际代码是必要的
  • 是的,ExtractFilesFromZipAndWriteToGivenZipArchive() 不是异步的!当我添加“等待”时,一切正常。如果您想写答案@T.Trassoudaine,我会很高兴地接受;)

标签: c# asp.net .net testing


【解决方案1】:

ExtractFilesFromZipAndWriteToGivenZipArchive() 是一个异步函数,这意味着,在这种情况下,您需要 await 它:

await ExtractFilesFromZipAndWriteToGivenZipArchive(file, archive, i, cancellationToken);

否则,执行将继续执行而不等待函数返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多