我將數百個 xml 檔案加載到兩個不同的資料表中,以便在網格中系結和顯示每個資料表。這適用于 Windows 表單應用程式。
每個查詢都與另一個非常不同,因此運行一個查詢并加載兩個表不起作用。
我正在使用它來加載 xml:
public async Task loadXMLs(List<string> xmlfiles)
{
var loadTasks = new List<Task>();
foreach (String xml in xmlfiles)
{
loadTasks.Add(Task.Run(() => openXMLs(xml)));
}
await Task.WhenAll(loadTasks);
}
public static async Task openXMLs(string xml)
{
XDocument xdoc = XDocument.Load(xml);;
if(xdoc != null)
{
loadXMLdatatable1(xdoc, xml);
loadXMLdatatable2(xdoc, xml);
}
}
public static async Task loadXMLdatatable1(XDocument xdoc, string xml)
{
var query = xdoc.Elements (Long query here for XML)
lock(datatable1)
{
foreach(var item in query)
{
datatable1.Rows.Add(
item
);
}
}
}
public static async Task loadXMLdatatable2(XDocument xdoc, string xml)
{
var query = xdoc.Elements (Long query here for XML)
lock(datatable2)
{
foreach(var item in query)
{
datatable2.Rows.Add(
item
);
}
}
}
我的問題是,當我更改為:
public static async Task openXMLs(string xml)
{
XDocument xdoc = XDocument.Load(xml); ;
if (xdoc != null)
{
Task dt1 = Task.Run(() => loadXMLdatatable1(xdoc, xml));
Task dt2 = Task.Run(() => loadXMLdatatable2(xdoc, xml));
await Task.WhenAll(dt1, dt2);
}
}
我以為我會看到性能有所提高,但加載時間是相同的。
我這樣做是正確的還是不可能在任務中運行異步?
uj5u.com熱心網友回復:
使用資料表總是很尷尬,因為它們不支持異步加載的現代概念。因此,在某個特定時刻,您只需要切換到不同的 UI,或進行其他潛在的重大更改,例如虛擬化資料。
你能做的最好的事情就是把盡可能多的作業推到鎖外。在您的情況下,您有一個查詢,但 LINQ 使用deferred execution,因此除非您在之前具體化您的查詢lock,否則實際查詢將在鎖內執行。
要具體化,您可以ToList在查詢結束時呼叫:
public static async Task loadXMLdatatable1(XDocument xdoc, string xml)
{
var items = xdoc.Elements()
.Whatever(Long query here for XML)
.ToList();
lock(datatable1)
{
foreach(var item in items)
{
datatable1.Rows.Add(item);
}
}
}
這樣,查詢將在不持有鎖的情況下執行。
如果這不能提供足夠的性能改進,或者如果您的查詢已經以具體化結束,那么您只需要使用資料虛擬化(可能使用 UI 重寫)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/430587.html
下一篇:如何將此迭代更改為異步函式?
