我正在使用xamarin构建一个Android应用程序,但这个问题主要与C#有关 在我的代码中,我需要做很少的事情,其中一些不需要其他部分,并且可以以并发方式发生。其中一些应该等到以前的行动才能带来结果。我以异步的方式尽我所能。目前,似乎我总是在等待(以异步方式)等待下一步行动之前完成的事情。
以下是我尝试做的一个例子:
项目#1 未与其他任何内容相关联。我需要它与其他人同时发生。他们不需要等到它回来。当它结束时它应该更新UI。
项目#2 & #3 应该在并发中发生。当他们 结束时,他们应该更新UI
项目#4 只能在#2和#3完成时发生。
我的问题是我需要什么才能满足这种要求。我只是要求指导。
答案 0 :(得分:4)
并行一词主要用于使用多个线程的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();
}
如果你的意思是并行执行,那么你需要使用ThreadPool
将工作卸载到Task.Run
线程,但这只能并行化异步方法的同步部分。
没有实际的理由将这些任务存储在一个变量中,这只是为了清楚起见。实际上我会写await Task.WhenAll(Second(), Third())
(带有专有名称)
答案 1 :(得分:-1)
我会做像
这样的事情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)
你没有等待任何事情