等待事情,但让事情以并发的方式运行
本文关键字:方式 运行 并发 等待 | 更新日期: 2023-09-27 18:27:54
我正在使用xamarin构建一个Android应用程序,但这个问题主要与C#有关。
在我的代码中,我需要做的事情很少,其中一些不需要其他部分,可以并发方式发生。他们中的一些人应该等到以前的行动才能带来结果。我正在以异步的方式尽我所能。目前,我似乎总是在等待(以异步方式(在下一个操作之前完成事情。
以下是我正在尝试执行的操作的示例:
- 从手机中引入用户映像。
- 获取最近通话的列表。
- 从手机获取特定联系人的列表。
- 从服务器获取有关编号 #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)
你不等待任何事情