2016-05-23 42 views
0

listboxと並んでwinformがあります。それぞれlistboxには、「追加」というラベルのtextboxButtonがあります。 textboxに何かを入れ、EFを使用して追加ボタンを押すと、listboxのテーブルが更新され、のlistboxが返されます。 [追加]ボタンのイベントハンドラのサンプルを次に示します。Winform - メソッドをasync/awaitに変更する

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

TypeCategoryAdd機能は以下のとおりです。私はこれをしたい(await気づく):

DBの更新が起こっているとき winform UIがフリーズしないように、私は別のコンテキストで実行する TypeCategoryAdd機能させるために何をする必要がありますどのような
private async void btnOfferType_Click(object sender, EventArgs e) 
{ 
    await TypeCategoryAdd("OfferType", tbOfferType.Text.Trim()); 
} 

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完了。コードを1つの 'case'に減らしてください。あなたの助け、素晴らしい記事、あなたのブログ、あなたの本をありがとう。 – Zuzlx

+0

@StephenCleary 3Kポイントを持っていた人が私を助けようとしましたが、試したことで何らかのエラーが発生しました。そこで、彼は答え全体を完全に削除することに決めました。だから私は正方形に戻ってきた。あなたが私の質問に何か提案があれば、私は感謝するでしょう。 – Zuzlx

答えて

1

あなたはEF 6にasync方法の利点を取るためにそれを行うべきこと:

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エンティティフレームの作業を使用しています。残念ながら、それは 'SaveChangesAsync'と一緒にはありません。 – Zuzlx

+0

@Zuzlx [バージョン6は。](https://msdn.microsoft.com/en-us/library/dn220070%28v=vs.113%29.aspx)古いバージョンを使用していますが、アップグレードできませんか? – svick

+0

アップグレードする以外に選択肢がありません。さもなければ(ここでは間違っているかもしれません)、 'Task'で物をラップして、呼び出し側にオブジェクトを返すことができます。 – Zuzlx

1

あなたのデータベースTaskでアクセスし、その上awaitをラップすることができます。

private async void btnOfferType_Click(object sender, EventArgs e) 
{ 
    await Task.Run(()=>TypeCategoryAdd("OfferType", tbOfferType.Text.Trim())); 
} 
関連する問題