2011-03-14 227 views
7

如何在我的页面加载在asp.net中同时调用多个方法? 我有4种方法在我的页面加载事件中调用。 但我想调用所有4个方法,而不是等待第1个方法完成,然后调用第2个方法。同时调用或调用多个方法?

如何在asp.net 4.0中实现这个功能?

+0

使用多线程 – 2011-03-14 12:07:20

+0

嗨Abhishek,你不能一次调用所有4种方法,必须至少有一秒的延迟。如果你仍然想调用4种方法,那么因为Davide Piras告诉你使用多线程,并且需要借助“BackgroundWorker”类来返回值,所以需要等到并且除非所有4个方法都执行。 – SharpUrBrain 2011-03-14 13:01:03

+1

@SharpUrBrain - 什么“一秒”处理任何事情?并且IMO BackgroundWorker在网络层 – 2011-03-14 18:56:23

回答

9
Task[] tasks = new Task[] 
{ 
    new Task(Method0), 
    new Task(Method1), 
    new Task(Method2), 
    new Task(Method3) 
} 

foreach(var task in tasks) 
    task.Start(); 

或者更短期

new Task(Method0).Start(); 
new Task(Method1).Start(); 
new Task(Method2).Start(); 
new Task(Method3).Start(); 
+2

上的选择也很差,'new [] {new Task(Method0),...,new Task(MethodN)}'应该可以工作 – 2011-03-14 12:18:04

+0

Thanks @Marc,Edited! – 2011-03-14 13:29:36

1

如果你让你的方法异步它会工作。

(基本短线):

method1(onReadyCallback1); 
method2(onReadyCallback2); 

private void onReadyCallback1() { 

} 

1

从MSDN文档看看该ThreadPool.QueueUserWorkItem然后here为例

using System; 
using System.Threading; 
public class Example { 
    public static void Main() { 
     // Queue the task. 
     ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc)); 

     Console.WriteLine("Main thread does some work, then sleeps."); 
     // If you comment out the Sleep, the main thread exits before 
     // the thread pool task runs. The thread pool uses background 
     // threads, which do not keep the application running. (This 
     // is a simple example of a race condition.) 
     Thread.Sleep(1000); 

     Console.WriteLine("Main thread exits."); 
    } 

    // This thread procedure performs the task. 
    static void ThreadProc(Object stateInfo) { 
     // No state object was passed to QueueUserWorkItem, so 
     // stateInfo is null. 
     Console.WriteLine("Hello from the thread pool."); 
    } 
} 
14

首先关闭,重要的是要知道你在做什么是敏感的IBLE。如果它们都是CPU绑定的,那么不要做到这一点,IMO;一个Web服务器已经高度线程化,并且通常是一个繁忙的地方。使用多个内核会降低整体速度的可能性很高。不过,它对于1位用户来说看起来很棒!

如果你是IO绑定,那么有任何数字的方法来做到这一点;首选的是使用内置的异步方法来处理任何你正在谈论的内容,所以你可以使用IOCP而不是普通的线程。因此,对于NetworkStream,您将使用BeginRead(...)等。

然后,您需要将所有内容连接在一起。有更多的方法;我个人倾向于使用Monitor.WaitMonitor.Pulse,因为这避免了非托管代码(许多等待句柄实际上是由操作系统提供的)。

另请注意:线程/并行性与许多有趣的失败方式捆绑在一起,通常你只需要过度担心静态方法/数据进行同步,但如果你有多个线程在单个请求服务处理:注意颠簸......有很多。

.NET的下一个版本旨在使延续更容易;我需要看看我们能够轻松地将当前的实验代码应用于IOCP场景。

+3

尼斯马克,这绝对是回答这个问题的方法,因为它提供了更多的指导,而不仅仅是回答问题。 – 2011-03-14 12:14:41

+0

“Web服务器已经高度线程化” - 这一行使我避免了多次调用我的应用程序。谢谢!! – xameeramir 2015-06-05 16:16:45