C# 无法从视图中的异步方法返回值

C# 无法从视图中的异步方法返回值,c#,asp.net,asp.net-mvc,asp.net-mvc-4,async-await,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Async Await,我试图从asynchtml助手返回值,但它给出的是以下字符串而不是所需的值 “System.Threading.Tasks.Task+WhenallPromission`1[System.Decimal]” 方法: public async static Task<decimal> CalculateCurrency(this HtmlHelper helper, decimal amount, string from, string country) { i

我试图从
async
html助手返回值,但它给出的是以下字符串而不是所需的值

“System.Threading.Tasks.Task+WhenallPromission`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;
    }

视图不支持异步方法。因此,对于结果类型,您将得到默认的
.ToString()
函数的结果,该函数实际上只返回类型名称

选项:

  • 将代码移动到控制器,并使用
    wait
    从异步顶级(非子级)操作调用。通过模型或
    ViewBag
  • 如果必须从视图或子操作调用,请转换为真正的同步代码
  • 如果不可能,请尝试
    .Result
    ,但要注意死锁。有关详细信息/链接,请参阅

注意:将
async
代码移动到子操作将没有帮助。

视图不支持异步方法。因此,对于结果类型,您将得到默认的
.ToString()
函数的结果,该函数实际上只返回类型名称

选项:

  • 将代码移动到控制器,并使用
    wait
    从异步顶级(非子级)操作调用。通过模型或
    ViewBag
  • 如果必须从视图或子操作调用,请转换为真正的同步代码
  • 如果不可能,请尝试
    .Result
    ,但要注意死锁。有关详细信息/链接,请参阅

注意:将
async
代码移动到子操作将没有帮助。

从视图调用异步代码不是一个好主意。@DavidG如何解决此问题?我希望该方法异步运行在该方法内部执行异步工作,但同步返回。@DavidG我希望提高应用程序性能,这就是我使用异步方法的原因,还有其他方法吗?或者我如何用这个方法做到这一点?@Usama对不起,我不会为你写代码。我给了你一个正确的方向——开始研究!如果您遇到任何问题,请随时发布另一个问题!从视图调用异步代码不是一个好主意。@DavidG如何解决这个问题?我希望该方法异步运行在该方法内部执行异步工作,但同步返回。@DavidG我希望提高应用程序性能,这就是我使用异步方法的原因,还有其他方法吗?或者我如何用这个方法做到这一点?@Usama对不起,我不会为你写代码。我给了你一个正确的方向——开始研究!如果您遇到任何问题,请随时发布另一个问题!
@Html.CalculateCurrency(22, "USD", "EUR")