使用C#.net异步调用多个方法但是顺序调用

时间:2014-02-10 11:38:17

标签: c# asp.net vb.net asynchronous delegates

我想异步调用方法的数量,但每个方法应在完成前一个方法后执行。

直到现在,我在一个Master方法下包装了所有方法,并使用委托异步调用它(主方法)。 现在要求已经改变,并且可以根据不同状态调用或不调用在侧方法中顺序调用的方法。 我可以通过检查不同的排列和组合来实现当前架构。但我想异步但顺序执行每个方法

这是我当前的异步运行实现(注意:这是描述我的功能的示例代码

功能1

private void SaveCustomer(List<Customer> customers)
{
  // Doing some calculation and saving customer in database 
}

功能2

private decimal CalulateRate(RateInfo applicableRate)
{
  // Calculate rate and some other factors and save in database
}

功能3

GenerateInvoice(decimal calculatedRate,DateTime effectiveDate, 
                Int32  NumberOfDays)
{
   // generating invoice and saving in database
}

功能4

GenerateCustomerDocuments(List<DocumentInfo> documentsToGenerate,
                          List<Customer>  customers)
{
   // generating diffrent documents for customers
}

我从一个主方法异步调用上述所有函数

Private void ExecuteCustomerRegistration(CustomerRegInfo custRegInfo)
{
     //CustomerRegInfo is a class which contains all input parameter            
       object for below methotds

     SaveCustomer(custRegInfo.Customers);
     decimal rate = CalulateRate(custRegInfo.ApplicableRate);
     GenerateInvoice(rate,custRegInfo.EffectiveDate,custRegInfo.NumberOfDays);
     GenerateCustomerDocuments(custRegInfo.DocumentsToGenerate,
                               documentsToGenerate.Customers)

}

使用委托异步调用ExecuteCustomerRegistration方法

protected delegate void delg_DoProcess(CustomerRegInfo custRegInfo);
protected void btnRegisterCustomer_Click(object sender, EventArgs e)
{
     delg_DoProcess doProc = new delg_DoProcess(ExecuteCustomerRegistration);

     CustomerRegInfo custRegInfo = GetCustomersRegInfo();
     doProc.BeginInvoke(custRegInfo, null, null);
}

我想为每个下面的方法异步做同样的工作 这样的执行顾客注册方法

  1. 异步调用 SaveCustomer
  2. 完成SaveCustomer异步调用 CalulateRate
  3. 完成CalulateRate后,异步调用 GenerateInvoice
  4. 完成GenerateInvoice调用 GenerateCustomerDocuments 异步
  5. 请建议我怎么做。目前我正在使用.net 4.0

1 个答案:

答案 0 :(得分:0)

您可以链接多个任务。

var firstTask  = new Task(() => SaveCustomer(custRegInfo.Customers);
var SecondTask = firsttask.ContinueWith((t)=> CalulateRate(custRegInfo.ApplicableRate)).
firstTask.Start();

请注意,这只是一个例子,并不是说你应该如何做到这一点。但它让您了解如何使用任务和继续。哪个应该符合你的目的。