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

C# 使用C.net异步但顺序地调用多个方法,c#,asp.net,vb.net,asynchronous,delegates,C#,Asp.net,Vb.net,Asynchronous,Delegates,我想异步调用许多方法,但每个方法都应该在前一个方法完成后执行 到目前为止,我将所有方法包装在一个主方法下,并使用委托异步调用itMaster方法。 现在需求已经改变,在侧主方法中顺序调用的方法可能被调用,也可能不被调用,这取决于不同的状态。 通过检查不同的排列和组合,我可以在当前架构中实现它。但我希望异步但顺序地执行每个方法 这是我当前异步运行的实现注意:这是描述我的功能的示例代码 职能1 职能3 职能4 使用委托异步调用ExecuteCustomerRegistration方法 我想为下面的每

我想异步调用许多方法,但每个方法都应该在前一个方法完成后执行

到目前为止,我将所有方法包装在一个主方法下,并使用委托异步调用itMaster方法。 现在需求已经改变,在侧主方法中顺序调用的方法可能被调用,也可能不被调用,这取决于不同的状态。 通过检查不同的排列和组合,我可以在当前架构中实现它。但我希望异步但顺序地执行每个方法

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

职能1

职能3

职能4

使用委托异步调用ExecuteCustomerRegistration方法

我想为下面的每个方法异步执行相同的工作 ExecuteCostomerRegistration方法如下

异步调用SaveCustomer SaveCustomer调用完成时异步调用CalulateRate 异步完成CalulateRate调用GenerateInvoice时 GenerateInvoice完成后,异步调用GenerateCustomerDocuments
请告诉我怎么做。目前我正在使用.net 4.0,您可以链接多个任务

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

请注意,这只是一个例子,并不是说这就是你应该如何做的。但它让您了解了如何使用任务和延续。这应该可以满足您的需要。

您可以使用C 5编译器和Microsoft.Bcl.Async包吗?这将使事情变得更简单。@JonSkeet:现在不可能更新框架C5,我正在尝试实现TYYapproach@NeerajKumarGupta:我不是建议改变框架。C5是语言版本,不是框架版本。这就是我建议使用Microsoft.Bcl.Async的原因,它允许您在.NET 4中使用Async/await,只要您有一个C 5编译器。
private decimal CalulateRate(RateInfo applicableRate)
{
  // Calculate rate and some other factors and save in database
}
GenerateInvoice(decimal calculatedRate,DateTime effectiveDate, 
                Int32  NumberOfDays)
{
   // generating invoice and saving in database
}
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)

}
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);
}
var firstTask  = new Task(() => SaveCustomer(custRegInfo.Customers);
var SecondTask = firsttask.ContinueWith((t)=> CalulateRate(custRegInfo.ApplicableRate)).
firstTask.Start();