Tôi muốn tải các tài liệu XML lớn vào các đối tượng XDocument. Cách tiếp cận đồng bộ đơn giản sử dụng XDocument.Load(path, loadOptions)
hoạt động tốt, nhưng chặn trong một thời gian dài không thoải mái trong ngữ cảnh GUI khi tải các tệp lớn (đặc biệt là từ bộ nhớ mạng).Tải XDocument không đồng bộ
Tôi đã viết phiên bản không đồng bộ này với mục đích cải thiện khả năng phản hồi trong tải tài liệu, đặc biệt khi tải tệp qua mạng.
public static async Task<XDocument> LoadAsync(String path, LoadOptions loadOptions = LoadOptions.PreserveWhitespace)
{
String xml;
using (var stream = File.OpenText(path))
{
xml = await stream.ReadToEndAsync();
}
return XDocument.Parse(xml, loadOptions);
}
Tuy nhiên, trên 200 MB tệp thô XML được tải từ đĩa cục bộ, phiên bản đồng bộ hoàn tất sau vài giây. Phiên bản không đồng bộ (chạy trong một bối cảnh 32-bit) thay vì ném một OutOfMemoryException
:
at System.Text.StringBuilder.ToString()
at System.IO.StreamReader.<ReadToEndAsyncInternal>d__62.MoveNext()
Tôi tưởng tượng này là do sự biến chuỗi tạm thời sử dụng để giữ XML thô trong bộ nhớ cho phân tích bởi các XDocument
. Có lẽ trong kịch bản đồng bộ, XDocument.Load()
có thể truyền qua tệp nguồn và không bao giờ cần phải tạo một Chuỗi lớn duy nhất để giữ toàn bộ tệp.
Có cách nào để tận dụng tối đa cả hai thế giới không? Tải XDocument
với I/O hoàn toàn không đồng bộ và không cần phải tạo một chuỗi tạm thời lớn?
Có lẽ bạn nên sử dụng 'XDocument.Load (stream)'? – DavidG
Làm cách nào để hoạt động tải không đồng bộ? – Hydrargyrum
Vâng, trong chính nó sẽ không, nhưng nó sẽ loại bỏ biến chuỗi bạn có ở đây và hy vọng ngoại lệ OOM. – DavidG