我想解析一个xml文件,序列化数据并将其发送给客户端。如您所知,解析文件可能需要一些时间,所以我经常得到例外:
[IOException:进程无法访问文件'E:... \ file.xml',因为它正由另一个进程使用。]
我决定在我的动作控制器中添加一个try / catch块。如果有异常,请执行一些thread.sleep并再试一次。我的新代码如下所示:
public PartialViewResult _warningsView(string containerId)
{
var myXslTrans = new XslCompiledTransform();
FileStream fileStream = null;
warnings result = null;
bool isFileProcessed = false;
while (!isFileProcessed)
{
try
{
myXslTrans.Load(Properties.Settings.Default.DataFolder + "/alert.xslt");
myXslTrans.Transform(Properties.Settings.Default.DataFolder + "/alert.xml", Properties.Settings.Default.DataFolder + "/TransAlert.xml");
XmlSerializer serializer = new XmlSerializer(typeof(warnings));
fileStream = new FileStream(Properties.Settings.Default.DataFolder + "/TransAlert.xml", FileMode.Open);
result = (warnings)serializer.Deserialize(fileStream);
isFileProcessed = true;
}
catch
{
Thread.Sleep(100);
}
finally
{
if (fileStream != null)
{
fileStream.Dispose();
}
}
}
return new Ext.Net.MVC.PartialViewResult
{
RenderMode = RenderMode.AddTo,
ContainerId = containerId,
Model = result.warningList,
WrapByScriptTag = false
};
}
这个解决方案对我有用,但我认为它会让我的程序变慢。有没有更好的方法呢?
答案 0 :(得分:1)
感谢每一个人。 我刚刚找到了这个解决方案:我不是用XslCompiledTransform创建新文件,而是创建临时文件(每个请求的唯一文件名)或MemoryStream。
答案 1 :(得分:0)
是的,在等待机会阅读时睡觉会让你的应用变慢。
看起来你一遍又一遍地读同一个文件。您可以将文件作为嵌入式资源添加到项目中,并以此方式读取。由于您的操作是只读的,因此应该无异常地工作,但可能仍然很慢。
查看此以获取有关此兔洞的更多信息: http://social.msdn.microsoft.com/Forums/en-US/c2d5a464-5a04-4107-9fba-26ff5f8ef720/multiple-access-to-embedded-resources-inside-a-net-assembly?forum=netfxbcl