2016-05-25 6 views
2

私はロングランニングI/Oがasync/awaitにぴったりのコードを持っています。私は、リポジトリパターンをやっていると私はオブジェクトは、このコードで、私は細かい作業を実施していますリポジトリパターンで非同期待機を行うにはどうすればよいですか?

public class HomeController : Controller 
    { 
    private ImainRepository _helper = null; 

    public HomeController() 
    { 
     this._helper = new MainRepository(); 
    } 
    public async Task<string> Aboutt() 
    { 
     // Here I get the error 
     object main = await _helper.Top_Five() ?? null; 
     if(main != null) 
     { 
      return main.ToString(); 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 

方法をawaiter方法が含まれていないそうだとしてコントローラに待つ行う方法を見つけ出すことはできませんあなたが以下に見るように。私はデータベースからデータを取り出し、それを文字列形式で返します。私が望むのは、作る方法を見つけることです。 オブジェクトmain = await _helper.Top_Five()??ヌル;それ以外の場合は、同期コードと非同期を混在させています。どんな提案も素晴らしいでしょう...

public async Task<string> Top_Five() 
    { 
     try 
     { 

      using (NpgsqlConnection conn = new NpgsqlConnection("Config")) 
      { 
       conn.Open(); 
       string Results = null; 
       NpgsqlCommand cmd = new NpgsqlCommand("select * from streams limit 15)t", conn); 


       using (var reader = await cmd.ExecuteReaderAsync()) 
       { 
        while (reader.Read()) 
        { 

         Results = reader.GetString(0); 
        } 

        return Results; 
       } 
      } 
     } 
     catch(Exception e) 
     { 
      // Log it here 
      return null; 
     } 

    } 
+0

あなたのプロジェクトで使用するように設定されている.NETフレームワークのバージョンはありますか?確かにそれは4.5以上でなければならないと確信しています –

+0

はい実際にはAsp.NetコアRC2 –

+0

私はエラーを再現できません。あなたは[mcve]を提供できますか? – svick

答えて

1

これは機能しますか?

object main = (await _helper.Top_Five()) ?? null; 

お知らせ余分(、あなたが方法を待って、その後nullをチェックする必要があるため)

+0

私はそれを試しましたが、それでもそのエラーが出ています –

+0

括弧は何の助けにもなりません。それはすでにコンパイラがその式を理解する方法です。 – svick

+0

@svickどのような作業をしているのかはわかりませんが、それは私にかなりのエラーを与えています。 – hvaughan3

0

Top_Fiveがnullまたはstringを返し、コードが不要であることを考慮:

代わり
object main = await _helper.Top_Five() ?? null; 

、次の手順を実行します。

var main = await _helper.Top_Five(); // the "awaiter" completes now 
return main; // returns a string or null like in your example 
+0

これはまだ冗長です。 – Servy

0

問題は上のnull合体演算子を使用することですTask方法。あなたは、次の点を考慮し、違ったことを処理する必要があります:あなたawaitあなたがstringとして戻っているようあなたが必要とするすべてであるので、stringとしてそれを宣言すること

public class HomeController : Controller 
{ 
    private ImainRepository _helper = null; 

    public HomeController() 
    { 
     this._helper = new MainRepository(); 
    } 

    public async Task<string> Aboutt() 
    { 
     string main = await _helper.Top_Five(); 
     return main; 
    } 
} 

お知らせ - ないobject

0

あなたの全体の方法は何も達成していません。 ?? nullはnullをnullに置き換え、それ以外のものはそれ自身で置き換えます。それだけで結果が変わるので、次のように書くことができます:

public Task<string> Aboutt() 
{ 
     return _helper.Top_Five(); 
} 
関連する問題