私は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();
}