我最近开始使用Async CTP,虽然我发现它对Self Coded类等非常有用,但在尝试使用Generated Code实现它时遇到了一些麻烦,特别是生成的TableAdapter使用数据集时。
我有一个使用.Fill调用的应用程序可以填充DataGrids和Databindings。由于.Fill块和我的用户需要能够在此过程中与应用程序进行交互,因此我认为Async CTP是理想的解决方案。
不幸的是,我似乎无法将其与生成的TableAdpters一起使用,而无需自己编写代码。我有什么选择?
答案 0 :(得分:1)
问题是TableAdapter没有异步Fill方法。这意味着让您的Fill在不阻塞UI线程的情况下运行,您必须在其上运行工作线程。异步CTP对此没有帮助 - 它使得使用异步API变得更容易,但如果API的异步版本不存在则无济于事。
但是在工作线程上运行填充应该像启动任务一样简单:
public Task FillAsync()
{
return Task.Factory.StartNew( () =>
{
adapter1.Fill(ds1);
adapter2.Fill(ds2);
// etc
});
}
现在,async CTP会派上用场,如果你需要在填充之后做一些额外的工作,你需要在UI线程上进行额外的工作:
public async Task RebindUI()
{
// Do stuff on UI thread
// Fill datasets on background thread
await FillAsync();
// When fill is complete do some more work on the UI thread
refreshControls();
}
默认情况下,在WinForms / WPF / Silverlight应用程序中运行时,等待它将在UI线程上恢复,因此在后台线程上完成填充工作后,将在UI线程上调用refreshControls。
有一个涵盖此here的示例: (UI响应性 - > CPU绑定任务期间的响应式UI)