流读取错误

Yur*_*riy 3 delphi delphi-2010

我在重负载下收到此错误消息.这是我的错误日志中的代码摘要和消息.我尝试了我能想到的一切.任何建议将不胜感激.

Procedure tCacheInMemory.StreamValue(Name: String; IgnoreCase: Boolean; Var Stream:     TStringStream);
Var
  i: Integer;
Begin
  i := 0;
  Try
    If Not active Then
      exit;
    arrayLock.BeginRead;
    Try
      i := Search(Name);
      If i > -1 Then Begin
        If fItems[i].value = Nil Then
          exit;
        fItems[i].value.Position := 0;
        Stream.Position := 0;
        Stream.CopyFrom(fItems[i].value, fItems[i].value.Size);
      End;
    Finally
      arrayLock.EndRead;
    End;
  Except { ...execution jumps to here }
    On E: Exception Do Begin
      x.xLogError('LogErrorCacheInMemory.txt', 'StreamValue:' + E.Message + ' ItemsCount:' + IntToStr( High(fItems)) + 'Memory:' + IntToStr(x.GetMemoryInfoMemory) + endLn + 'StreamSize : ' + IntToStr(fItems[i].value.Size) + ' i=' + IntToStr(i) + 'Name: ' + Name);
      Clear;
    End
  End;
End;
Run Code Online (Sandbox Code Playgroud)

日志条目:

 3/10/2011 10:52:59 AM: StreamValue:Stream read error ItemsCount:7562 Memory:240816
   StreamSize : 43 i=7506 Name: \\xxxxxxxx\WebRoot\\images\1x1.gif
3/10/2011 12:39:14 PM: StreamValue:Stream read error ItemsCount:10172 Memory:345808
   StreamSize : 849 i=10108 Name: \\xxxxxxxx\WebRoot\\css\screen.add.css
3/10/2011 3:45:29 PM: StreamValue:Stream read error ItemsCount:11200 Memory:425464
   StreamSize : 3743 i=11198 Name: \\xxxxxxxx\WebRoot\\JS\ArtWeb.js
Run Code Online (Sandbox Code Playgroud)

PS

arrayLock: TMultiReadExclusiveWriteSynchronizer;
 fItems: Array Of rCache;
Type
  rCache = Record
    Name: String;
    value: TStringStream;
    expired: TDateTime;
  End;
Run Code Online (Sandbox Code Playgroud)

和调用功能:

Function tCacheInMemory.CacheCheck(cName: String; Out BlobStream: TStringStream):   Boolean;
Begin
Result := False;
   If Not IfUseCache Then
      exit;
    BlobStream.SetSize(0);
    BlobStream.Size := 0;
    StreamValue(trim(cName), True, BlobStream);
    If BlobStream.Size > 0 Then
    Result := True;
End;
Run Code Online (Sandbox Code Playgroud)

`

Rob*_*edy 8

你没有使用正确的锁定.您正在获取缓存条目数组的锁定,但是一旦找到所需的项目,就会对其进行修改.首先,通过分配其属性来显式修改它Position,然后通过读取它来隐式修改它,Position再次修改它的属性.当其他代码尝试从同一个缓存项读取时,您将受到干扰.如果源流的Position属性在目标流计算可用字节数和实际请求读取这些字节的时间之间发生变化,则会出现流读取错误.

我有几条与此相关的建议:

  • 首先不要将流用作存储设备.你显然是持有文件的内容.您不会更改它们,因此您不需要为进行顺序更改而设计的数据结构.相反,只需将数据存储在简单的字节数组中:TBytes.(另外,TStringStream特别是对这些字符串的编码是否重要引起了混淆.简单的文件缓存根本不应该与字符串编码有关.如果必须使用流,请使用与内容无关的类TMemoryStream.)
  • 不要平息你没有实际处理的异常.在此代码中,您将捕获所有异常类型,记录一些信息,清除缓存,然后继续进行,就好像一切正​​常一样.但是你没有做任何事情来解决触发异常的问题,所以一切都不正常.由于您并未真正处理异常,因此需要确保它传播给调用方.打电话raise后打电话Clear.(当您记录异常时,请确保记录异常的ClassName值及其消息.)