微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin/C# 在具有不同返回类型的后台线程非 UI上并行运行两个任务

如何解决Xamarin/C# 在具有不同返回类型的后台线程非 UI上并行运行两个任务

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

这是我所拥有的:

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. 这些任务会并行运行吗?
    我不确定单个任务中的等待会发生什么?它们是否会在单独的后台线程上运行,每个线程并行等待各自的结果,从而按预期运行?或者他们会因为等待而以某种方式顺序运行?

  2. 单独的问题,但我的研究并没有说明这一点。 “await”是否总是创建一个独立于 UI 的线程,和“Task.Run”一样?

这是正确的做法吗? 请指教/更正。

解决方法

这些任务会并行运行吗?

它们会同时运行,是的。

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

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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。