XDocument不使用任务加载文件

时间:2013-11-20 04:39:19

标签: linq-to-xml task

我有这段代码,我写的是使用XDocument.Parse加载XML文件 方法。我基本上需要以5秒的固定间隔读取XML文件。

问题是代码“XDocument.Parse(res.Result)”以及之后的任何内容都没有被执行,即应用程序刚刚完成执行而不处理此代码。

但是,如果我将相同的代码放在任务方法之外,那么它可以正常工作。我尝试过使用XDocument.Load方法并使用Timer但我遇到了同样的问题。

  public void starttest()
    {

        string FilePath = @"C:\Users\maxpayne\Documents\JobSchedule.xml";
        Task<string>.Factory.StartNew(() =>LoadFile(FilePath)).ContinueWith((res)=>{
            //
            XDocument doc = XDocument.Parse(res.Result);
            Console.Write(res.Result);


            ProcessJob(LoadJob(doc));
            UpdateJobs();

            Sleep(5000);
        }); ;

    }

2 个答案:

答案 0 :(得分:0)

将加载/解析合并为一个以删除不必要的延续。

public void starttest()
{
    Task.Factory.StartNew((state) =>
    {
        var doc = XDocument.Load((string)state);
        ProcessJob(LoadJob(doc));
        UpdateJobs();
    }, @"C:\Users\maxpayne\Documents\JobSchedule.xml");
}

答案 1 :(得分:0)

您的问题是该文件正在另一个线程上加载,但您不是在等待该任务完成。当ContinueWith返回时,任务已经启动,但可能尚未完成。

Task<string>.Factory
            .StartNew(() => LoadFile(FilePath))
            .ContinueWith((res) => 
                          {
                              XDocument doc = XDocument.Parse(res.Result);
                              Console.Write(res.Result);

                              ProcessJob(LoadJob(doc));
                              UpdateJobs();

                              Sleep(5000);
                          })
           .Wait();

当然,如果你正在等待任务完成(这是),你不仅没有更快或者并行做任何事情,你也浪费资源这样做,因为你正在使用两个此操作的线程。