【问题标题】:Running data downloading on background thread在后台线程上运行数据下载
【发布时间】:2020-08-30 03:29:42
【问题描述】:

我正在构建一个新应用程序,因为我希望它像每个人一样流畅,所以我想使用一个后台线程来负责使用 restsharp 下载所有数据。我也遵循 MVVM 模式。 我已经阅读了很多关于 task.run 以及如何正确使用它以及整个 async-await 主题的内容。但由于我对这一切都是陌生的,我不确定我应该如何正确地做事。我有很多代码,所以我会简短地尝试解释我在做什么,然后放一个sn-p。

所以我开始创建一个服务类,其中包含所有使用 restsharp 获取数据的函数。在我的 ViewModel 中,我一开始就调用了这些函数。我尝试使用任务并在后台线程上运行这些功能,但应用程序在初始屏幕上被阻止。显然那是因为我做错了......所以我决定问你们。

我有这个功能的例子:

public string GetResPor()
{
    var restClient = new RestClient { BaseUrl = new Uri("http://xxx.xxx.xxx.xxx:xxxx") };
    var request = new RestRequest
    {
        Resource = "getCliPor",
        Method = Method.GET
    };
    request.AddParameter(new Parameter { Name = "idt", Value = GetImAsync().GetAwaiter().GetResult(), Type = ParameterType.GetOrPost });
    var result = restClient.Execute(request);
    Port = result.Content;
    return Port;
}

当我在任务上转换它时:

public async Task<string> GetResPor()
{
    var restClient = new RestClient { BaseUrl = new Uri("http://xxx.xxx.xxx.xxx:xxxx") };
    var request = new RestRequest
    {
        Resource = "getCliPor",
        Method = Method.GET
    };
    request.AddParameter(new Parameter { Name = "idt", Value = GetImAsync().GetAwaiter().GetResult(), Type = ParameterType.GetOrPost });
    var result = await restClient.ExecuteTaskAsync(request);
    Port = result.Content;
    return Port;
}

在 ViewModel 上,我首先创建服务类的新实例,然后:

Port = RD.GetRestauPort().GetAwaiter().GetResult();

这就是应用程序被阻止的地方,没有例外。

【问题讨论】:

  • async/await 与使用后台任务/线程不同
  • @Jason 感谢您的快速回复。我同意,这就是为什么我问,我如何使用背景线程?在另一个线程上运行所有数据下载的想法是否有帮助?你有任何可以帮助我的链接吗?

标签: api mvvm xamarin.forms async-await task


【解决方案1】:

为了简单起见,让我们从基础开始。为了在后台线程中运行某些东西,最简单的方法是在Task.Run() 中调用它。这是做什么的:

将指定的工作排入队列以在 ThreadPool 上运行,并为该工作返回一个任务或 Task&lt;TResult&gt; 句柄。

基本上,您将工作委托给 TreadPool,它会为您处理所有事情 - 寻找工作人员,等待工作人员完成其工作(在新线程上),然后通知您结果。

因此,基本上,无论您想在后台线程中做什么,最简单的解决方案是将其包装在 Task.Run() 中并等待其结果,以备不时之需。

另外,避免使用GetAwaiter().GetResult()。异步编程的简单规则是 - 如果你可以等待,await all the way up

您可以在

中阅读有关主题的更多信息
  1. this SO post
  2. Advanced Tips for Using Task.Run With Async/Await
  3. Using Task.Run in Conjunction with Async/Await

【讨论】:

  • 非常感谢您的回答,我会立即查看链接
  • 如果对您有帮助并回答了您的问题,请用绿色勾号标记我的答案,以便帮助其他人。 :)
猜你喜欢
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多