c# - 与TableAdapter一起使用await

我最近开始使用异步CTP,尽管我发现它对自编码类等非常有用,但是在尝试使用生成的代码实现它时,我遇到了一些麻烦,特别是在工作时生成的TableAdapters。与数据集。

我有一个使用.Fill调用来填充DataGrid和Databindings的应用程序。由于.Fill块和我的用户需要能够在此过程中与应用程序进行交互,因此我认为Async CTP是理想的解决方案。

不幸的是,我似乎无法将其与生成的TableAdpters一起使用,而不必自己编写代码。我有什么选择?

最佳答案

问题在于TableAdapters没有异步的Fill方法。这意味着要使Fill能够运行而不会阻塞UI线程,则必须在其上运行工作线程。异步CTP对此无济于事-它使使用异步API更容易,但是如果API的异步版本不存在,它将无济于事。

但是,在工作线程上运行填充应该和启动Task一样容易:

public Task FillAsync()
{
    return Task.Factory.StartNew( () =>
    {
        adapter1.Fill(ds1);
        adapter2.Fill(ds2);
        // etc
    });
}


现在,异步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线程上恢复,因此在后台线程上完成Fill工作后,将在UI线程上调用refreshControls。

有一个样本涵盖了此here
(UI响应-> CPU绑定任务期间的响应UI)

本文翻译自 https://stackoverflow.com/questions/7129662/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c# asynchronous tableadapter


相关文章:

c# - Typography.Capital在Windows 7上不起作用

javascript - 如何从异步调用返回响应?

c# - 如何基于两个表过滤TableAdapter的FillBy?

c# - powerShell.AddCommand的用法

c# - 更新GeometryModel3D材质的单个点而不是整个点系统的颜色

c# - 等待多个任务是否会比第一个例外观察到更多?

c# - 对调度程序和异步感到困惑

c# - 使用TableAdapter还是以编程方式插入?

c# - 如何通过C#从App.config文件读取连接字符串