Использование await с TableAdapter - PullRequest
2 голосов
/ 20 августа 2011

Я недавно начал использовать Async CTP, и, хотя я нашел его весьма полезным для классов Self Coded и т. П., Я столкнулся с небольшим затруднением при попытке реализовать его с помощью Сгенерированного кода, в частности сгенерированных адаптеров таблицкогда вы работаете с набором данных.

У меня есть приложение, которое довольно часто использует .Fill, чтобы заполнить DataGrids и Databindings.Поскольку блоки Fill и мои пользователи должны иметь возможность взаимодействовать с приложением во время этого процесса, я считаю, что Async CTP является идеальным решением.

К сожалению, я не могу использовать его с сгенерированными TableAdpters без необходимости кодировать их сам.Какие у меня варианты?

1 Ответ

1 голос
/ 20 августа 2011

Проблема в том, что в TableAdapters нет асинхронных методов Fill.Это означает, что для запуска Fill без блокировки потока пользовательского интерфейса вам потребуется запустить на нем рабочий поток.Асинхронный CTP не поможет вам в этом - он упрощает использование асинхронных API, но не поможет, если асинхронная версия API не существует.

Но выполнение заполнения на рабочем местеПоток должен быть таким же простым, как ускорение Задачи:

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

Теперь асинхронная CTP пригодится, если вам нужно проделать некоторую дополнительную работу после заливок, и вам нужна эта дополнительная работа для выполненияпоток пользовательского интерфейса:

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, когда вы ожидаете, оно возобновится в потоке пользовательского интерфейса, поэтому refreshControls будет вызываться в вашем потоке пользовательского интерфейса после выполнения операции Fill.выполняется в фоновом потоке.

Вот пример, который охватывает этот здесь : (Отзывчивость пользовательского интерфейса -> Отзывчивый пользовательский интерфейс во время задач с привязкой к процессору)

...