我是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();
}
答案 0 :(得分:1)
异步支持是即将推出的EF6的一部分。
查看KSA的相关博文,了解概述。
http://odetocode.com/Blogs/scott/archive/2012/08/26/async-in-entity-framework-6-0.aspx
这样,您将使用取消令牌切换到ToListAsync。