【问题标题】:Xamarin/C# Running two tasks in parallel on background threads (non UI) with different return typesXamarin/C# 在具有不同返回类型的后台线程(非 UI)上并行运行两个任务
【发布时间】:2021-02-04 22:00:48
【问题描述】:

我正在尝试实现代码以并行运行两个任务。 任务返回的值分配给两个不同的局部变量,任务完成后需要使用。

这是我所拥有的:

var return1 = new ReturnType1();
var task1 = Task.Run(async() => 
{
   return1 = await MyAPI.GetSomeData(param1);
});

var return2 = new ReturnType2();
var task2 = Task.Run(async() =>
{
   return2 = await MyApi.GetSomeOtherData(param2);
});

var tasks = new List<Task>();
tasks.Add(task1);
tasks.Add(task2);

await Task.WhenAll(tasks);

bool isNotNullReturn1 = return1 != null;
bool isNotNullReturn2 = return2 != null;

// And just to check return types have been assigned
Console.WriteLine($"{isNotNullReturn1.ToString(), {isNotNullReturn2.ToString()}}");
  1. 这些任务会并行运行吗?
    我不确定各个任务中的 await 会发生什么?它们会在单独的后台线程上运行,每个线程并行等待各自的结果,从而按预期运行吗?或者他们会因为等待而按顺序运行?

  2. 单独的问题,但我的研究并没有明确这一点。 “await”是否总是创建一个与 UI 不同的线程,与“Task.Run”相同?

这是正确的方法吗? 请建议/纠正。

【问题讨论】:

  • 1.是的,这些任务将并行运行。您可以阅读有关Threads and threading 的文档。 2. await 是一个运算符,我不认为 'await' 创建单独的线程,它只是 C# 中的语法。阅读this document about await。

标签: multithreading xamarin asynchronous async-await


【解决方案1】:

这些任务会并行运行吗?

它们将同时运行,是的。

我不确定各个任务中的 await 会发生什么?它们会在单独的后台线程上运行,每个线程并行等待各自的结果,从而按预期运行吗?或者他们会因为等待而按顺序运行?

await 在其当前方法中按顺序操作。在这种情况下,该方法只是传递给Task.Run 的委托。因此,一个委托中的 await 与另一委托中的 await 无关。

单独的问题,但我的研究并没有明确这一点。 “await”是否总是创建一个与 UI 不同的线程,与“Task.Run”相同?

No.

这是正确的方法吗?请建议/纠正。

目前,这段代码有点复杂:

var task1 = Task.Run(async() => 
{
   return1 = await MyAPI.GetSomeData(param1);
});

它将工作(委托)发送到后台线程,然后该工作以异步方式运行(允许后台线程返回线程池)。假设GetSomeData是真正异步的(即不阻塞调用线程),那么后台线程是多余的;不需要Task.Run。

另一个值得注意的建议是,如果您返回结果而不是将它们设置为执行代码的副作用,那么异步代码往往会更简洁。

我会这样写:

var task1 = MyAPI.GetSomeData(param1);
var task2 = MyApi.GetSomeOtherData(param2);

await Task.WhenAll(task1, task2);

var return1 = await task1;
var return2 = await task2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多