【发布时间】:2014-08-20 15:10:22
【问题描述】:
我想解析一个 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
};
}
这个解决方案对我有用,但我认为它会使我的程序变慢。有没有更好的方法来做到这一点?
【问题讨论】:
-
为什么文件有时会被另一个进程使用?我会对此进行调查,而不是在控制器方法中使用 Sleep()。
-
正如 West 所说...或者如果您出于某种正当理由无法停止使用它,也许您可以获取 xml 文件的临时副本并进行处理?即不要使用文件流,如果文件不是太大,可能会将整个文件加载到内存中。
-
应该使用 memoryStream 进行转换或使用 tempFile。
-
所有客户端同时调用_warningsView方法。所以 TransAlert.xml 文件账单会同时被多个线程处理
-
你的xml文件更新了吗?那是你收到错误的时候吗?
标签: c# asp.net-mvc