Вы можете посмотреть в BackgroundWorkerThreads.
http://www.albahari.com/threading/part3.aspx
Я использовал их совсем немного при получении данных. Я хотел бы отобразить панель ожидания, вызвать событие DoWork, где данные извлекаются в набор данных (для нас это обычно занимает больше времени, чем присоединение указанных данных к сетке), затем в событии RunWorkerCompleted я прикрепил данные к сетке и скрыл бар ожидания Приложение все еще зависало на несколько секунд, но не так долго.
Вот пример кода. По сути, блокируйте поля, которые могут вызвать повторный вызов RefreshInventory
(но поскольку вы загружаете при запуске, возможно, это не относится к вам). Затем извлеките данные из потока и прикрепите его, когда поток закончится.
public void RefreshInventory()
{
// Lock any fields you want to lock during the update process
// Display some kind of waiting or progress bar
if (!bkgdWrkInventory.IsBusy)
bkgdWrkInventory.RunWorkerAsync();
}
private void bkgdWrkInventory_DoWork(object sender, DoWorkEventArgs e)
{
var db = new AcidDBDataContext();
e.Result = db.GetProducts.ToList();
}
private void bkgdWrkInventory_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null) // Check for errors
{
dgvInventory.DataSource = (List<Product>)e.Result;
}
else
{
// Show the error to the user
}
// Hide the waiting indicator
// Unlock the fields
}