实体框架取消长时间运行的查询

时间:2012-10-09 13:20:41

标签: entity-framework task-parallel-library async-await

我是TPL的新手。我正在使用TPL对数据库进行一些异步调用。 GetDocumentAsync方法下面被多次调用,并且在卸载不同线程上的任务时做得很好,以保持UI线程的响应。

这里有两个目标:1)保持UI线程响应2)让用户能够中止请求。

我已设法中止请求但是我无法中止Entity框架已经放入数据库的请求,并且查询正在db级别运行..或者它甚至还没有启动。

因此,GetDocuments方法仍会返回已取消任务的文档。

有没有我可以中止来自EF的请求?我可以在实施中做得更好吗?

    Entities _context = new Entities();

    CancellationTokenSource _tokenSource = new CancellationTokenSource();

    public async void GetDocumentsAsync(string userName)
    {
        IList<Document> results;
        try
        {
            results = await 
            Task<List<Document>>.Factory.StartNew(() =>
            {
                _tokenSource.Token.ThrowIfCancellationRequested();
                return GetDocuments(userName);
            }, _tokenSource);

        }
        catch (OperationCanceledException ex)
        {
            Debug.WriteLine(string.Format("Task canceled for user {0} on thread", userName ));
        }

        if(!_tokenSource.IsCancellationRequested)
        {
            // results is used to update the UI 
        }
    }

    public void Abort()
    {
        _tokenSource.Cancel();
    }

    public List<Document> GetDocuments(string userName)
    {
        //I am using the connected model and need to use the Context for change tracking and other goodies..
        var query = from c in _context.Documents
                    where c.CreatedBy == userName
                    select c;

        query = query.Take(50); // I want to be able to cancel this query. Can this be done ???

        return query.ToList();
    }

1 个答案:

答案 0 :(得分:1)

异步支持是即将推出的EF6的一部分。

查看KSA的相关博文,了解概述。

http://odetocode.com/Blogs/scott/archive/2012/08/26/async-in-entity-framework-6-0.aspx

这样,您将使用取消令牌切换到ToListAsync。

http://entityframework.codeplex.com/SourceControl/changeset/view/fe17fe748307#src%2fEntityFramework%2fIQueryableExtensions.cs