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)
`
你没有使用正确的锁定.您正在获取缓存条目数组的读锁定,但是一旦找到所需的项目,就会对其进行修改.首先,通过分配其属性来显式修改它Position,然后通过读取它来隐式修改它,Position再次修改它的属性.当其他代码尝试从同一个缓存项读取时,您将受到干扰.如果源流的Position属性在目标流计算可用字节数和实际请求读取这些字节的时间之间发生变化,则会出现流读取错误.
我有几条与此相关的建议:
TBytes.(另外,TStringStream特别是对这些字符串的编码是否重要引起了混淆.简单的文件缓存根本不应该与字符串编码有关.如果必须使用流,请使用与内容无关的类TMemoryStream.)raise后打电话Clear.(当您记录异常时,请确保记录异常的ClassName值及其消息.)