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">

?

这是正确的方法吗?请通知/正确的。

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

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;

相关内容

  • 没有找到相关文章

最新更新