2011-03-14 43 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