我有一个夜间的Azure C# Windows服务,它更新表格并在5-10个Azure SQL数据库上调用长时间运行(~小时)的存储过程。由于我可以在Azure SQL中同时运行所有数据库工作,性能几乎没有影响,因此我希望异步运行它们。我可以使用async void (使用Await Task.Delay(10))调用一个方法,也可以创建一个新线程。
什么是更好的方法?有关系吗?
编辑:这是一个异步void方法的例子。我想确定它在做什么。
public static async void DoRanking(object e)
{
// will start all orgs concurrently
await Task.Delay(10);
... do a bunch of database work here ...
... call a long running stored procedure here ...
}发布于 2021-01-01 01:05:00
您可以使用较旧的Thread/ThreadPool API或较新的TPL。但在这两种情况下,您都不应该在线程池线程上启动一个长时间运行的进程。
使用新线程或LongRunning任务:
指定任务将是一个长时间运行的粗粒度操作,与细粒度系统相比,该操作涉及更少、更大的组件。它向TaskScheduler提供了一个提示,即可能需要超额订阅。超额订阅允许您创建比可用硬件线程数更多的线程。它还向任务计划程序提供提示,提示该任务可能需要一个额外的线程,以便它不会阻塞本地线程池队列中其他线程或工作项的转发进度。
https://stackoverflow.com/questions/65521392
复制相似问题