2016-05-25 49 views
2

我有長時間運行的I/O綁定完美的異步/等待代碼。我做倉庫模式,想不通,因爲我得到一個對象不包含在此代碼awaiter方法如何在存儲庫模式中進行異步等待?

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; 
     } 
    } 
} 

,我實施精品工程的方法怎麼辦控制器等待如下所示。我從數據庫中獲取數據並以字符串格式返回。我想要的是找到一種方法來製作 object 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返回nullstring,代碼是不必要的:

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 COALESCE運營商Task方法。你需要處理的是不同的,考慮以下因素:

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; 
    } 
} 

注意,當你await是所有你需要爲你返回爲string,所以聲明爲string - 不是object

0

你的整個方法都沒有完成。 ?? null將null替換爲null,並將其他內容替換爲null。這就是你對結果的唯一轉換,所以你可以寫下:

public Task<string> Aboutt() 
{ 
     return _helper.Top_Five(); 
}