C# 如何编写一个XElement以异步方式归档,而不点击";“多个根节点”;问题
我使用XML来模拟数据库,当加载虚拟数据时,我不断收到一个错误,告诉我有多个根元素。打开文件后,我可以确认多个根元素正在写入文件,但除了同步调用进程之外,我所做的任何事情似乎都无法阻止它这样做 下面是我的代码示例:C# 如何编写一个XElement以异步方式归档,而不点击";“多个根节点”;问题,c#,.net,asynchronous,linq-to-xml,xelement,C#,.net,Asynchronous,Linq To Xml,Xelement,我使用XML来模拟数据库,当加载虚拟数据时,我不断收到一个错误,告诉我有多个根元素。打开文件后,我可以确认多个根元素正在写入文件,但除了同步调用进程之外,我所做的任何事情似乎都无法阻止它这样做 下面是我的代码示例: // Check to see if the file is available. If it is, parse it. Otherwise create // a new root element. Done in the constructor since the XEleme
// Check to see if the file is available. If it is, parse it. Otherwise create
// a new root element. Done in the constructor since the XElement is used in
// multiple locations.
public CourseXmlWriter()
{
if (!File.Exists(Settings.Default.DataDirectory + Settings.Default.AltDb))
{
_courses = new XElement("Courses");
}
else
{
var attempts = 0;
while (attempts < MaxAttempts)
{
try
{
using (var stream = new FileStream(_dataFile,
FileMode.OpenOrCreate, FileAccess.Read, FileShare.None))
{
_courses = XElement.Load(stream);
}
break;
}
catch (IOException)
{
Thread.Sleep(1000);
attempts++;
}
}
}
}
回调函数:
private void CreateCourseComplete(IAsyncResult ar)
{
var caller = (Func<CreateCourseRequest, CreateCourseResponse>) ar.AsyncState;
var result = caller.EndInvoke(ar);
if (result.Status == ResponseBase.ResponseStatus.Successful)
{
_successful++;
}
}
private void CreateCourseComplete(IAsyncResult ar)
{
var caller=(Func)ar.AsyncState;
var result=caller.EndInvoke(ar);
if(result.Status==ResponseBase.ResponseStatus.Successful)
{
_成功++;
}
}
有什么想法吗?我猜,在您开始编写文件并开始重新编写文档之后,您会发现一个
IOException
尝试捕获该异常并将其记录下来
当代码捕获异常并忽略它时,这通常不是一个好兆头。祝贺你,你问了一个关于异步代码的问题,但没有显示任何运行异步的代码。@I4V对此表示抱歉。我已经添加了上述通话。同样,这是一个测试应用程序,所以我没有对结果做太多处理。我是有意捕获IOException的,因为我希望遇到它。在放弃并以不同方式处理之前,我想尝试多次访问此文件。@elucid8从查看您的代码来看,我仍然认为您遇到了“意外”异常。看起来您期望的是“无法写入文件”,但您遇到了由
XElement.Save在它开始写入流后抛出的其他内容。尝试在异常发生时记录它们,您可能会找到答案。@elucid8另外,假设我对异常的看法是错误的,您是否可以包含来自“多个根”异常的堆栈跟踪?
for (var i = 0; i < coursesToGenerate; i++)
{
var request = new CreateCourseRequest
{
Description = Path.GetRandomFileName().Replace(".", ""),
Name = Path.GetRandomFileName().Replace(".", "")
};
Func<CreateCourseRequest, CreateCourseResponse> func =
_courseAgent.CreateCourse;
func.BeginInvoke(request, CreateCourseComplete, func);
}
private void CreateCourseComplete(IAsyncResult ar)
{
var caller = (Func<CreateCourseRequest, CreateCourseResponse>) ar.AsyncState;
var result = caller.EndInvoke(ar);
if (result.Status == ResponseBase.ResponseStatus.Successful)
{
_successful++;
}
}