等待事情,但让事情以并发的方式运行

本文关键字:方式 运行 并发 等待 | 更新日期: 2023-09-27 18:27:54

我正在使用xamarin构建一个Android应用程序,但这个问题主要与C#有关。
在我的代码中,我需要做的事情很少,其中一些不需要其他部分,可以并发方式发生。他们中的一些人应该等到以前的行动才能带来结果。我正在以异步的方式尽我所能。目前,我似乎总是在等待(以异步方式(在下一个操作之前完成事情。

以下是我正在尝试执行的操作的示例:

  1. 从手机中引入用户映像。
  2. 获取最近通话的列表。
  3. 从手机获取特定联系人的列表。
  4. 从服务器获取有关编号 #2 和 #3 的数据。

项目 #1 未连接到其他任何内容。我需要它与其他人同时发生。他们不需要等到它回来。当它结束时,它应该更新 UI。

项目 #2#3 应同时发生。当它们结束时,它们应该更新 UI

项目 #4 只能在 #2 和 #3 完成后发生。

我的问题是我需要什么才能实现这种要求。我只要求指导方针。

等待事情,但让事情以并发的方式运行

"并行"一词主要用于使用多个线程的 CPU 密集型执行。我的猜测是,你的意思是并发,这意味着异步操作是同时执行的,而不是按顺序执行的

这是async方法应如何使用Task.WhenAll进行交互的简单布局,该允许异步等待多个任务完成:

async Task Foo()
{
    var t1 = First();
    var t2 = SecondAndThirdAndFourth();
    await Task.WhenAll(t1,t2);   
}
async Task First()
{
    // Bring the user image from the phone.
    // update UI
}
async Task SecondAndThirdAndFourth()
{
    var t2 = Second();
    var t3 = Third();
    await Task.WhenAll(t2, t3);
    // Update UI
    await Fourth();
}

如果你的意思是并行执行,那么你需要使用 Task.Run 将工作卸载到ThreadPool线程,但这只会并行化异步方法的同步部分。


没有实际理由将这些任务存储在变量中,这只是为了清楚起见。实际上,我会写await Task.WhenAll(Second(), Third())(用专有名称(

我会做类似的事情

var t1 = StartTask(t1);
var t4andUIupdateAfterT2andT3 = new List[ CreateAndNotStart(t4) , CreateAndNotStart(UIUpdateAfterT2andT3) ];
var t2andt3 = new List [ StartTask(t1) , StartTask(t1) ];
t1.ContinuteWith(UpdateUI);
t2andt3.Continuewith(t4andUIupdateAfterT2andT3)

你不等待任何事情