2014-07-12 28 views
0

我试图从async html helper返回值,但它给出以下字符串而不是所需的值。无法从视图中的异步方法返回值

“System.Threading.Tasks.Task + WhenAllPromise`1 [System.Decimal]”

方法:

public async static Task<decimal> CalculateCurrency(this HtmlHelper helper, decimal amount, string from, string country) 
    { 
     if (await getValue(country)) 
     { 
      string fromCurrency = string.IsNullOrEmpty(from) ? "USD" : from; 
      string toCurrency = country; 
      WebClient client = new WebClient(); 
      string url = string.Format("http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s={0}{1}=X", fromCurrency.ToUpperInvariant(), toCurrency.ToUpperInvariant()); 
      Stream response = await client.OpenReadTaskAsync(url); 
      StreamReader reader = new StreamReader(response); 
      string yahooResponse = await reader.ReadLineAsync(); 
      response.Close(); 
      if (!string.IsNullOrWhiteSpace(yahooResponse)) 
      { 
       string[] values = Regex.Split(yahooResponse, ","); 
       if (values.Length > 0) 
       { 
        decimal rate = System.Convert.ToDecimal(values[1]); 
        string res = string.Format("{0:0.00}", rate * amount); 
        return decimal.Parse(res); 
       } 
      } 
      return decimal.Zero; 
     } 
     return decimal.Zero; 
    } 

呼叫HTML辅助:

@Html.CalculateCurrency(22, "USD", "EUR") 
+0

从视图中调用异步代码不是一个好主意。 – DavidG

+0

@DavidG我该如何解决这个问题?我想要该方法运行异步 – Anony

+0

在方法内部执行异步工作但同步返回。 – DavidG

回答

4

视图不支持异步方法。因此,你会得到结果类型的默认.ToString()函数的结果,它确实只返回类型名称。

选项:

  • 移动代码到控制器和异步顶层(非独生子女)行动await打电话英寸通过数据模型,通过或ViewBag
  • 转换为真正的同步代码,查看是否必须,如果无法把它从视图或儿童行动
  • 尝试.Result,但要注意死锁。详情请见await vs Task.Wait - Deadlock?

注意:将async代码移动到子操作将无济于事。