我如何正确使用'收益率'使用TaskScheduler.FromCurrentSynchronizationContext()?

时间:2015-01-28 23:54:42

标签: xml wpf multithreading wcf c#-4.0

我在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线程上。有没有更好的方法来做这件事?

0 个答案:

没有答案