2016-05-23 2 views
0

У меня есть winform с шестью listbox бок о бок. Под каждым listbox есть textbox и Button с надписью «Добавить». Когда вы помещаете что-то в textbox и нажмите кнопку «Добавить», используя EF, я обновляю таблицу для этого listbox, а я возвращаю dataBindlistbox. Вот пример одного из обработчиков событий для кнопки Add:Winform - изменение метода async/wait

private void btnOfferType_Click(object sender, EventArgs e) 
{ 
    TypeCategoryAdd("OfferType", tbOfferType.Text.Trim()); 
} 

TypeCategoryAdd функция приведена ниже. Я хочу, чтобы это сделать (обратите внимание await):

private async void btnOfferType_Click(object sender, EventArgs e) 
{ 
    await TypeCategoryAdd("OfferType", tbOfferType.Text.Trim()); 
} 

Что мне нужно сделать, чтобы сделать функцию TypeCategoryAdd работать на различных условиях, так что winform UI не замерзают, когда DB обновление происходит ?

private void TypeCategoryAdd (string table, string item) 
{ 
    if (string.IsNullOrEmpty(item)) return; 

    using (MenuGenerator.NewArchMenuGeneratorEntities con = new NewArchMenuGeneratorEntities()) 
    { 
     switch (table) 
     { 
      case "OfferType": 
       if (con.OfferTypes.Any(x=>x.Name == item)) 
       { 
        MessageBox.Show("There is already a " + item + " on the list!"); 
        tbOfferType.Text = ""; 
        return; 
       } 
       OfferType ot = new OfferType(); 
       ot.Name = item; 
       con.OfferTypes.Add(ot); 
       try 
       { 
        con.SaveChanges(); 
        tbOfferType.Text = ""; 
        lstOfferType.DataSource = con.OfferTypes.OrderBy(x=>x.Id).ToList();      
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show("Error " + ex.ToString()); 
       } 
       break;     

      } 
      return; 
     } 
+0

Пожалуйста, уменьшите код до [минимально возможного, чтобы воспроизвести ошибку] ​​(http://stackoverflow.com/help/mcve). –

+0

@ StephenCleary Done. Уменьшите код до одного 'case'. Благодарим вас за помощь, отличные статьи, ваш блог и вашу книгу. – Zuzlx

+0

@StephenCleary У некоторых, у кого было 3K rep points, пытался помочь мне, но все, что он пытался, вызвало какую-то ошибку. Поэтому он решил полностью удалить весь ответ. Поэтому я вернулся на круги своя. Если у вас есть предложения по моему вопросу, я буду благодарен. – Zuzlx

ответ

1

Что вы должны сделать это, чтобы воспользоваться преимуществами async методов в EF 6:

private async Task TypeCategoryAdd (string table, string item) 
{ 
    if (string.IsNullOrEmpty(item)) return; 

    using (MenuGenerator.NewArchMenuGeneratorEntities con = new NewArchMenuGeneratorEntities()) 
    { 
     switch (table) 
     { 
      case "OfferType": 
       if (await con.OfferTypes.AnyAsync(x=>x.Name == item)) 
       { 
        MessageBox.Show("There is already a " + item + " on the list!"); 
        tbOfferType.Text = ""; 
        return; 
       } 
       OfferType ot = new OfferType(); 
       ot.Name = item; 
       con.OfferTypes.Add(ot); 
       try 
       { 
        await con.SaveChangesAsync(); 
        tbOfferType.Text = ""; 
        lstOfferType.DataSource = await con.OfferTypes.OrderBy(x=>x.Id).ToListAsync(); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show("Error " + ex.ToString()); 
       } 
       break;     

      } 
      return; 
     } 
    } 
} 
+0

Я использую ADO.Net Entity Frame work. К сожалению, он не поставляется с 'SaveChangesAsync' – Zuzlx

+0

@Zuzlx [Версия 6 делает.] (Https://msdn.microsoft.com/en-us/library/dn220070%28v=vs.113%29.aspx) Если вы Если вы используете более старую версию, не можете ли вы обновить ее? – svick

+0

Кажется, у меня нет выбора, кроме как обновить. В противном случае (возможно, я ошибаюсь здесь) нам придется обернуть вещи в «Задача», чтобы мы могли вернуть объект, который «awaitable» вызывающему. – Zuzlx

1

Вы можете обернуть доступ к базе данных в Task и await по этому вопросу.

private async void btnOfferType_Click(object sender, EventArgs e) 
{ 
    await Task.Run(()=>TypeCategoryAdd("OfferType", tbOfferType.Text.Trim())); 
} 
Смежные вопросы