【问题标题】:Entry input lag in Xamarin forms?Xamarin 表单中的输入输入滞后?
【发布时间】:2019-12-03 22:31:50
【问题描述】:
public decimal CurrencyConversion(decimal amount, string fromCurrency, string toCurrency)
{
    string url = string.Format(urlPattern, fromCurrency, toCurrency);

    using (var wc = new WebClient())
    {
        var json = wc.DownloadString(url);

        Newtonsoft.Json.Linq.JToken token = Newtonsoft.Json.Linq.JObject.Parse(json);
        decimal exchangeRate = (decimal)token.SelectToken("rate");
        var result = (amount * exchangeRate);
        return result;
    }
}

大家好,这是我尝试在输入字段中插入新数字时使用的代码,在显示下一个数字之前会有 1 秒的延迟。知道我该如何解决吗? :o

【问题讨论】:

  • 一目了然,我猜延迟是由于发出请求和处理它所花费的时间

标签: c# xamarin


【解决方案1】:

延迟必须只是由于下载字符串和处理它所花费的时间。您在这里唯一可以做的就是异步下载字符串,这将减少主线程中的负载以减少延迟。

public async decimal CurrencyConversion(decimal amount, string fromCurrency, string toCurrency)
{
    string url = string.Format(urlPattern, fromCurrency, toCurrency);
    var wc = new WebClient();
    var json = await wc.DownloadStringAsync(url);

    Newtonsoft.Json.Linq.JToken token = Newtonsoft.Json.Linq.JObject.Parse(json);
    decimal exchangeRate = (decimal)token.SelectToken("rate");
    var result = (amount * exchangeRate);
    return result;
}

【讨论】:

  • @Finally:如果我的回复对你有帮助,请记得将我的回复标记为答案,谢谢:)
  • 嘿,谢谢您的重播。我试过你的方法,但现在我得到 System.Threading.Task.task1[System.decimal] prntscr.com/q67rso 你可以在这里看到。你有什么想法现在如何解决吗? :D
  • 发布的答案应该可以正常工作。我做了一些更正。如果您仍然遇到错误,请将堆栈跟踪或更多详细信息发送给我以调试场景。
【解决方案2】:

那是对我有用的代码,只有在值存储在 ConcurrentDictionary 之后,一切都变得顺利。

static ConcurrentDictionary<string, decimal> cachedDownloads =
       new ConcurrentDictionary<string, decimal>();

        public async Task<decimal> CurrencyConversionAsync(decimal amount, string fromCurrency, string toCurrency)
        {
            string content = "";
            string url = string.Format(urlPattern, fromCurrency, toCurrency);
            Decimal result = 0;
             decimal exchangeRate = 0;
            if (CheckForInternetConnection() == false)
            {
                result = amount * decimal.Parse("1.11");
               return result;
            }

            if (cachedDownloads.TryGetValue(content, out exchangeRate))
            {
                    result = (amount * exchangeRate);
                    return result;

            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-06
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多