我有一个ASP.NET
应用程序,我为我们的零售店建立了。该系统的一个特征是将现有订单发送到我们的POS系统,以便加快为客户创建收据。此过程包含当前同步运行的几种方法,其中只有少数对创建收据和让客户快速处理的过程很重要。其余的方法是POS和内部应用程序所需的清理和内务管理,这些方法需要花费大量时间。
目前,启动此过程的按钮按下应用程序约20秒,同时完成所有这些工作。
protected void btnSendReceipt_Click(...)
{
Method1(); // < 1 sec
Method2(); // < 1 sec
Method3(); // < 1 sec
Method4(); // 10+ sec
Method5(); // 10+ sec
Response.Redirect("Default.aspx");
}
Method1
,Method2
和Method3
是必需的,以便网络应用能够拥有所需的一切,但Method4
和Method5
一直需要。我研究了async
await
,但由于我不等待这些方法中的任何return
,我不确定这是否真的是我想要做的。进一步的研究表明,起始线程昂贵且浪费。所以我的问题是,我想要归档的是什么,以及我应该将注意力集中在哪个方向,以便有效地实现这一目标并采用适当的设计? (请注意,异常在Method4
和Method5
内部处理,执行过程中出现的任何问题都在Web应用程序外部,并且是单独处理的。此外,这些方法调用外部工具,我无法优化所以10+秒的运行时间不在我的控制之内。)
感谢您的任何建议。
答案 0 :(得分:2)
这将并行运行所有方法:
protected async void Button1_Click(object sender, EventArgs e)
{
var tasks = new List<Task>
{
Method1(),
Method2(),
Method3(),
Method4(),
Method5()
};
await Task.WhenAll(tasks);
}
public async Task Method1()
{
await Task.Delay(1000);
}
public async Task Method2()
{
await Task.Delay(1000);
}
public async Task Method3()
{
await Task.Delay(1000);
}
public async Task Method4()
{
await Task.Delay(10000);
}
public async Task Method5()
{
await Task.Delay(10000);
}
您可能不关心方法4/5的结果,但是您是否希望将任务解雇并忘记?这是需要考虑的事情,因为可能会发生异常。等待回复将使您有机会捕获这些异常并采取相应的行动。
答案 1 :(得分:2)
如果您不需要从方法4&amp; 5,你可以用
Task.Run(()=>Method4());
Task.Run(()=>Method5()));
避免等待来自他们的响应,并在启动任务后重定向。任务比Threads使用更少的开销