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

时间:2014-10-27 13:32:29

标签: c# xamarin async-await

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

以下是我尝试做的一个例子:

  1. 从手机中提取用户图片。
  2. 获取最近的电话清单。
  3. 从手机获取特定联系人列表。
  4. 从服务器获取有关编号#2和#3的数据。
  5. 项目#1 未与其他任何内容相关联。我需要它与其他人同时发生。他们不需要等到它回来。当它结束时它应该更新UI。

    项目#2 & #3 应该在并发中发生。当他们 结束时,他们应该更新UI

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

    我的问题是我需要什么才能满足这种要求。我只是要求指导。

2 个答案:

答案 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)

你没有等待任何事情