Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写一个XElement以异步方式归档,而不点击";“多个根节点”;问题_C#_.net_Asynchronous_Linq To Xml_Xelement - Fatal编程技术网

C# 如何编写一个XElement以异步方式归档,而不点击";“多个根节点”;问题

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

我使用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 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++;
    }
}