3

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

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

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

因此,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();
    }
4

1 回答 1

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

于 2012-10-09T13:57:38.850 回答