我在WCF服务中有一个长时间运行的进程,可能会返回一个大型XML。为了避免内存不足,我决定以块的形式查询xml是个好主意。所以我这样做了:
Task<IEnumerable<XElement>> aTask = Task.Factory.StartNew(() => this.QueryServer());
并实现QueryServer()
private IEnumerable<XElement> QueryServer()
{
using (var s = new MyService())
{
for (DateTime halfADay = StartDate; halfADay < EndDate.Date.AddHours(12); halfADay = halfADay.AddHours(12))
{
yield return s.MyServiceClient.DownloadLargeXElement(
halfADay,
halfADay.AddHours(12));
}
}
}
我的问题是,如果我使用TaskScheduler.FromCurrentSynchronizationContext()
,用户界面会挂起
但如果我不使用它,那么我的UI一旦完成查询XML就不会更新
aTask.ContinueWith(
(a) =>
{
if(a.IsCompleted)
{
foreach(XElement row in a.Result.Select(x => x.Elements()).First())
{
DataRow dataRow = this.XElementToDataRow(row);
MyTable.Rows.Add(row);
}
}
},
**TaskScheduler.FromCurrentSynchronizationContext()**);
我知道这种情况正在发生,因为当它到达我的foreach时,它会查询服务器,但此时我们又回到了UI线程上。有没有更好的方法来做这件事?