如何解决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()}}");
-
这些任务会并行运行吗?
我不确定单个任务中的等待会发生什么?它们是否会在单独的后台线程上运行,每个线程并行等待各自的结果,从而按预期运行?或者他们会因为等待而以某种方式顺序运行? -
单独的问题,但我的研究并没有说明这一点。 “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 举报,一经查实,本站将立刻删除。