C# 在循环中对方法的多个异步方法调用

C# 在循环中对方法的多个异步方法调用,c#,asp.net,web-services,asynchronous,webforms,C#,Asp.net,Web Services,Asynchronous,Webforms,我花了一整天的时间尝试使用“AddOnPreRenderCompleteAsync”和“RegisterAsyncTask”的各种方法,但迄今为止没有成功 我使用'BeginExecuteReader'和'EndExecuteReader'成功地调用了DB异步,但这没有抓住要点。异步处理不应该是对DB的调用,在我的例子中,它应该是在调用外部web服务的“while”循环期间的之后 我认为简化的伪代码可以最好地解释: (注意:连接字符串使用“MultipleActiveResultSets”)

我花了一整天的时间尝试使用“AddOnPreRenderCompleteAsync”和“RegisterAsyncTask”的各种方法,但迄今为止没有成功

我使用'BeginExecuteReader'和'EndExecuteReader'成功地调用了DB异步,但这没有抓住要点。异步处理不应该是对DB的调用,在我的例子中,它应该是在调用外部web服务的“while”循环期间的之后

我认为简化的伪代码可以最好地解释:
(注意:连接字符串使用“MultipleActiveResultSets”)

访问数据库很快。从外部web服务获取返回的结果很慢,至少应该异步处理

如果对web服务的每次调用只需1秒,假设我只有100个用户,那么完成DB更新至少需要100秒,这显然不是一个选项。
最终应该有数千个用户(目前只有2个)

目前一切正常,只是非常同步:)
我想:
也许我处理这件事的方式是错误的?
也许整个过程都应该异步调用


你有没有考虑过把这整件事变成它自己的线索

你真正关心的是什么

避免长时间的任务阻塞您的应用程序? 如果是这样,您可以使用线程(请参阅BackgroundWorker)

并行处理对web服务的多个调用以加快整个过程?
如果是这样,可能可以通过提供回调异步调用web服务。您还可以使用线程池或。但是,在继续数据库更新之前,您必须设法等待所有呼叫或任务完成。

您应该尽可能短的时间保持数据库连接打开。因此,在遍历DataReader时不要做任何事情。大多数应用程序开发人员更喜欢将实际的数据库访问代码放在单独的层上,在这种情况下,您将向调用代码返回DataTable或类型化集合。此外,如果您正在更新从中读取的同一个表,这可能会导致锁定


一次将有多少用户执行此方法,需要多长时间刷新一次?您确定需要从web应用程序内部执行此操作吗?您可以考虑使用单线程来实现这一点,在这种情况下,即使在Web应用程序中,一对夫妇线程也完全合适。另一个需要考虑的是使用Windows服务,我认为它更适合于通过Web服务周期性更新数据,而Web服务甚至不与当前用户的会话有关。

id,为每个WebReQuesty创建一个线程,并这样做:

额外功能:

int privCompleteThreads = 0;
int OpenThreads = 0;
int CompleteThreads
{
  get{ return privCompleteThreads; }
  set{ privCompleteThreads = value; CheckDoneOperations(); }
}
void CheckDoneOperations
{
  if(CompleteThreads == OpenThreads)
  {
    //done!
  }
}
在主程序中:

foreach(time i need to open a request)
{
  OpenThreads = OpenThreads + 1;
  //Create thread here
}
在线程函数内部:

//do your other stuff here

//do this when done the operation:
CompleteThreads = CompleteThreads + 1;

现在我不确定这种方法有多可靠,这取决于你。但是一个普通的网络请求不应该花一秒钟,你的浏览器加载这个页面不会花一秒钟,是吗?我的加载速度尽可能快,我可以击中F5。这只是打开一个流,您可以尝试打开web请求一次,也可以反复使用同一个实例,看看这是否会加快它的运行速度。

Thanx的帮助:)我不确定我是否理解。你的意思是这样的:
threadobj=newthread(newthreadstart())是的,但是BackgroundWorker类对于这种用法更方便。你的意思是将循环中发生的所有事情都放到一个单独的函数中,并在它自己的线程中运行该函数?这似乎是可行的,但它真的能有效地解决我的问题吗?线程线程=新线程(新线程开始(MyFunction());thread.Start();-ThanxI通常不建议在web应用程序中旋转线程,但有时这正是您必须要做的。您可以考虑将此代码放入Windows服务中,并使其监视用于执行“命令”的DB表。这样,web应用程序本身就不对线程负责。只是一个想法。关于效率,如果你的web应用程序不必等待响应,那么这就是方法。Chris请查看上面的简化功能。您说过只要我的应用程序不必等待响应就可以了“-正如您从问题中的示例中所看到的,我实际上不必等待整个函数/方法,但它本身正在等待每次调用的web服务-因此,假设我在MyFunction上使用线程示例(如开头所述),我不确定我是否理解您所说的线程是一个复杂的主题。如果启动一个线程,那么应用程序的主线程不会等待,而是继续处理。这意味着客户端可能会在线程完成之前看到它们的响应返回。这意味着在客户认为已经完成时,你不会得到结果。同时,线程将继续处理,直到其工作完成。这似乎是你想要的。
//do your other stuff here

//do this when done the operation:
CompleteThreads = CompleteThreads + 1;