使用使用回调的公司库的 Xamarin 窗体中的异步 Web 服务请求



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

场景:

  • 我正在开发一个 Xamarin 窗体应用程序,我正在使用 棱镜(显然也是MVVM(。
  • 我对请求 Web 服务有一定的限制。其中之一 他们是: 我必须使用公司(和内部(库,因为我的工作中的安全和政治 .
  • 此公司库公开了请求 Web 的方法 使用回调的服务。其中一个看起来像这样:

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

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

我的问题是

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

我在下面的例子中思考,但我不知道哪一个可以更好,或者其中一个的组合是否可以更好,或者......都不是。

  1. 直接从视图模型调用库并使用回调: 使用回调示例
  2. 使用 System.Threading.Tasks.Task.Run 作为 UI 线程的包装器(直接从 ViewModel( 使用 Task.Run 示例
  3. 创建一个仅包含 Web 服务请求的单独类,并将回调用作异步方法。 单独的业务+回调示例

使用任务完成源。

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

最新更新