3

私はTPLを初めて使用します。TPL を使用してデータベースへの非同期呼び出しを行っています。下の GetDocumentAsync メソッドは複数回呼び出され、UI スレッドの応答性を維持するために別のスレッドでタスクをオフロードするのに適しています。

ここには 2 つの目的があります。1) UI スレッドの応答性を維持する。2) ユーザーがリクエストを中止できるようにする。

リクエストを中止することはできましたが、エンティティ フレームワークが既にデータベースに送信したリクエストを中止することはできず、クエリは 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();
    }
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 に答える