2013-02-15 101 views
0

这种方法:异步和匿名类型

private async Task readFileInfo(string folderId) 

有另一种方法的调用:

importCount = await VM.importVehicles(myXDoc); 

定义如下:(注:我改变它从一个for循环的每一个,但我会得到类似的结果)。当我踏上过它的iVehicle被突出显示,但然后直接转到for语句

Object reference not set to an instance of an object.

public async Task<Int32> importVehicles(XDocument importXMLDocument) 
{ 
    var Importedvehicles = from vehicle in importXMLDocument.Descendants("vehicle") 
          select new 
          { 
           VehicleName = vehicle.Element("VehicleName").Value, 
           VehicleYear = vehicle.Element("VehicleYear").Value, 
           Odometer = vehicle.Element("Odometer").Value, 
           LicensePlate = vehicle.Element("LicensePlate").Value, 
           OilWeight = vehicle.Element("OilWeight").Value, 
           OilQuantity = vehicle.Element("OilQuantity").Value, 
           OilFilterModelNumber = vehicle.Element("OilFilterModelNumber"), 
           AirFilterModelNumber = vehicle.Element("AirFilterModelNumber"), 
           OilChangedDate = vehicle.Element("OilChangedDate"), 
           OilChangedOdometer = vehicle.Element("OilChangedOdometer"), 
           NextOilChangeDate = vehicle.Element("NextOilChangeDate"), 
           NextOilChangeOdometer = vehicle.Element("NextOilChangeOdometer"), 
           SettingDistance = vehicle.Element("SettingDistance"), 
           SettingMonths = vehicle.Element("SettingMonths"), 
          }; 

    Int32 vehicleId; 
    vehicleId = await getMaxVehicleId(); 
    try 
    { 

     foreach (var item in Importedvehicles) 
     { 
      vehicle myImportedVehicle = new vehicle(); 
      myImportedVehicle.VehicleId = vehicleId += 1; 
      myImportedVehicle.ImagePath = "Assets/car2.png"; 
      myImportedVehicle.VehicleName = item.VehicleName; 
      myImportedVehicle.VehicleModel = item.VehicleName; 


      myImportedVehicle.VehicleYear = short.Parse(item.VehicleYear); 
      myImportedVehicle.CurrentOdometer = Convert.ToInt32(item.Odometer); 
      myImportedVehicle.LicensePlate = item.LicensePlate; 
      myImportedVehicle.LastOilChangedDate = Convert.ToDateTime(item.OilChangedDate.Value.ToString()).ToString("d"); 
      myImportedVehicle.LastOilChangedOdometer = (Int32)item.OilChangedOdometer; 
      myImportedVehicle.ReminderDistance = (Int32)item.SettingDistance; 
      myImportedVehicle.ReminderMonths = (Int32)item.SettingMonths; 

      vehicleInformation myImportVI = new vehicleInformation(); 
      myImportVI.OilWeight = item.OilWeight; 
      myImportVI.OilAmount = item.OilQuantity; 
      myImportVI.OilFilterNumber = item.OilFilterModelNumber.Value.ToString(); 
      myImportVI.AirFilterNumber = item.AirFilterModelNumber.Value.ToString(); 

      myImportedVehicle.vehicleInfo = myImportVI; 
      m_vehicles.Add(myImportedVehicle); 
     } 
    } 
    catch (Exception ex) 
    { 
     System.Diagnostics.Debug.WriteLine(ex.Message.ToString()); 
    } 

     await SaveList(); 
     return Importedvehicles.Count(); 
    } 

我发现了一个错误。然后它看起来错误,因为它还没有得到iVehicle的结果。

+0

你究竟在哪里返回任何东西? – BrokenGlass 2013-02-15 01:55:52

+1

我不认为这与'async/await'有什么关系。我敢打赌,由于**推迟执行**,在你的查询中有一些是空的。首先进行调试。 – 2013-02-15 01:57:57

+0

简短说明,但* complete *示例(其他人可以编译并运行)显示问题的代码。 – svick 2013-02-15 02:40:15

回答

1

这不是100%回答你的问题,但它应该给你一个好的开始。

在声明iVehicle之后调试器跳转到for...loop的原因是因为在声明它时没有执行查询。因此,iVehicle在这一点上不是匿名类型的集合。

当您拨打.Count()时,查询正在执行中,并且iVehicle正试图变为适当的匿名类型集合。但是,由于查询中的内容(在您拨打.Count()后执行)为null,因此您收到NullReferenceException

您应该首先验证importXMLDocument和来自Descendants()调用的返回值是否为空。

希望无论如何都有帮助。

编辑:

现在,你给一个完整的例子,你有地方,有可能正null堆。

每次使用此时间:

vehicle.Element("SomeElementNameHere") 

有可能被null。然后,您打电话给null对象上的.Value属性。

您需要确保每个元素都确实存在。隔离每个案例,并确定哪一个是null

+0

我同时检查了importXMLDocument和Desendants正在返回值。 – webdad3 2013-02-15 03:24:28

+0

现在你已经给出了一个恰当的例子,你应该确保每一个元素都在那里。我会用我的意思更新我的答案。 – 2013-02-15 03:30:34

+0

这是问题。 – webdad3 2013-02-15 04:04:08

1

试着写这样的代码:

var query = 
    from vehicle in importXMLDocument.Descendants("vehicle") 
    select new { ... }; 

var iVehicle = query.ToArray(); 

for (var i = 0; i <= iVehicle.Count(); i++) 
{ 
    ... 
} 

您需要强制查询的评价。这就是.ToArray正在做的事情。查询本身只是查询的定义,而不是结果。

+2

'Count()'扩展方法强制查询的评估... – 2013-02-15 02:18:12

+0

为什么不调用'ToArray()'导致'NullReferenceException'? – svick 2013-02-15 02:42:15

+0

@SimonWhitehead - 调用'Count()'会导致评估,但它将独立于循环内的评估。迭代序列会产生副作用,所以最好避免多次迭代。 – Enigmativity 2013-02-15 05:54:20