【问题标题】:Asynchronous web service request in Xamarin Forms using a corporate library that uses callbacksXamarin Forms 中的异步 Web 服务请求使用使用回调的公司库
【发布时间】:2018-09-17 22:43:14
【问题描述】:

今天,我有一个针对特定场景的特定问题。

场景:

  • 我正在开发一个 Xamarin Forms 应用程序并且我正在使用 PRISM(显然也是 MVVM)。
  • 我对请求 Web 服务有一些限制。之一 他们是:由于工作中的安全和政治原因,我必须使用公司(和内部)图书馆 .
  • 这个企业库公开了请求网络的方法 使用回调的服务。其中一个看起来像这样:

    public void Post(string requestUriString, string data,
                     System.Action callbackSuccess, System.Action callbackError);
    
  • 我的意思是,这个库不公开异步方法,如 HttpClient,用于 例子。取而代之的是,这个库使用回调方法。

  • 企业库对 android 和 ios(每个平台一个库)。也正因为如此,我需要使用依赖注入来使用平台特定的代码

我的问题是

实现这个库的最佳方式是什么(谈论性能和最佳实践),为什么? 主要问题是要解释为什么一种解决方案可能比其他解决方案更好,并给出一个示例(代码)。

我正在考虑下面的示例,但我不知道哪一个可能更好,或者它们中的一个组合是否会更好,或者......它们都没有。

  1. 直接从 ViewModel 调用库并使用回调: Using callbacks example
  2. 使用 System.Threading.Tasks.Task.Run 作为 UI 线程的包装器(直接来自 ViewModel) Using Task.Run example
  3. 创建一个单独的类,该类仅包含 Web 服务请求,并将回调用作异步方法。 Separate business + callbacks example

【问题讨论】:

  • 标准方法是使用TaskCompletionSource
  • 感谢您的 cmets @JSteward。我在问题中给出的所有可能的解决方案实际上都有效。我主要关心的是为什么其中哪一个不是最佳解决方案或为什么是最佳解决方案。

标签: c# performance asynchronous xamarin.forms async-await


【解决方案1】:

使用任务完成源。

public static class XXXExtensions
{
    public static Task PostAsync(this XXX self, string requestUriString, string data)
    {
        var tcs = new TaskCompletionSource<bool>();
        self.Post(
           requestUriString,
           data,
           () => tcs.TrySetResult(true)
           () => tcs.TrySetException(new Exception()));
        return tcs.Task;
    }
}

并像这样使用它:

await xxx.PostAsync(requestUriString, data);

【讨论】:

  • 嗨@Paulo Morgado,谢谢你的例子。关于您的解决方案,为什么您更喜欢这个解决方案而不是例如简单地使用回调(不使用任务)?我有一个 example 只使用没有 Task/await/async 的回调
  • 关于您的解决方案的另一个问题是:我应该直接在我的 ViewModel 中发出请求,还是像 this example 那样为所有 Web 服务请求使用不同的层?
  • async-await 使用同步上下文来确保您回到主线程。这就是现代 .NET 的工作原理。
  • 一旦你去异步,你必须一直去异步。您将在视图模型中进行异步调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
相关资源
最近更新 更多