【发布时间】: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,我会很高兴地接受;)