如何在C#中并行异步调用两个函数?

时间:2015-03-10 20:46:28

标签: c# .net multithreading asynchronous async-await

我有两个相互独立的静态函数,当它们单独使用时会占用大量资源。

public static class Helper(){
    public static void A(string username, int power, Model model)
        { /* do A things to the model */ }
    public static void B(string username, Model model)
        { /* do B things to the model */ }
}

现在,他们被称为

public ActionResult Home(){
    Model model = new Model();
    A("Jared", 9001, model);
    B("Jared", model);
    return View("Home", model);
}

在我的控制器中(attn:不是真正的代码)。

我希望它们能够异步并行工作,然后当它们完成时,我想返回同步处理,以便使用更新的模型返回View。

有没有办法实现这个目标?我以前从未使用异步C#或C#,所以我很难破译我发现的例子。

TIA

3 个答案:

答案 0 :(得分:4)

我假设你的意思是,并行异步。

首先更新您的函数以匹配以下内容:

public static async Task A(Model model) { /* ... */ }
public static async Task B(Model model) { /* ... */ }

然后更新您的调用代码,看起来像这样:

public async Task<ActionResult> Home() { 
    var taskA = A(model);
    var taskB = B(model);

    await Task.WhenAll(taskA, taskB);
    return View("Home", model);
}

答案 1 :(得分:2)

这应该可以解决问题..

public async Task<ActionResult> Home()
{ 
  var model = new Model();
  var t1 = Helper.A("Jared", 9001, model);
  var t2 = Helper.B("Jared", model);

  await Task.WhenAll(new [] { t1, t2 });

  return View("Home", model);
}

public static class Helper
{
  public static async Task A(string username, int power, Model model)
  {
    /* do A things to the model */ 
  }
  public static async Task B(string username, Model model)
  {
    /* do B things to the model */ 
  }
}

虽然有一个很大的“陷阱”。该模型必须能够同时处理A()B()

答案 2 :(得分:-2)

我会使用像这里描述的任务并行库https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx