2011-03-14 27 views
7

Sayfamda aynı anda birden fazla yöntem nasıl çağrılır asp.net ?? Sayfa yükleme olayımda aranacak 4 yöntem var. fakat 4 yöntemin tümünü çağırmak istiyorum ve 1. yöntemin bitirilmesi için beklemeyin, ardından 2. yöntemi arayın.Aynı anda birden fazla yöntem çağırın veya arayın.

Bunu nasıl elde edebilirsiniz asp.net 4.0?

+0

çok iş parçacığı kullan –

+0

Merhaba Abhishek, En az bir saniye gecikme olması gereken bir anda tüm 4 yöntemi arayamazsınız. Eğer hala 4 metodu aramak istiyorsanız, o zaman Davide Piras çoklu-okuma özelliğini kullandığını ve geri dönüş değeri için "BackgroundWorker" sınıfı beacause 'ın yardımını aldığınızı söyleyene kadar beklemeniz gerekir ve 4 metodun tamamı çalışmadığı sürece. – SharpUrBrain

+1

@SharpUrBrain - "bir saniyeyle" ne alakası var?Ve IMO BackgroundWorker ayrıca web katmanı –

cevap

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

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

Yoksa o iş olur senin yöntemleri asenkron yaparsanız daha kısa bir süre

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

üzerinde kötü bir seçim olduğunu, 'yeni [] {Yeni Görev (Method0), ..., Yeni Görev (MethodN)}' –

+0

Teşekkür @Marc, Edited çalışmalı! –

2

Ne yapmak istediğiniz zaman uyumsuz yöntem çağrıları yapmaktır.

1

MSDN belgeler arasından örneğin

ThreadPool.QueueUserWorkItem ve sonra here bir göz atın

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

İlk kapalı, yaptığınız şeyin sens olup olmadığını bilmek önemlidir ible. Hepsi CPU'ya bağlıysa, bunu yapmaz, IMO; Bir web sunucusu zaten çok iş parçacıklı ve genellikle başlamak için yoğun bir yer. Şanslar yüksek, her şeyi birden fazla çekirdek kullanarak yavaşlatacaksınız. Yine de, 1 kullanıcı için harika görünecek!

Eğer IO-bağlı iseniz, o zaman bunu yapmak için herhangi bir sayı vardır; Tercih edilen şey, konuştuğunuz her şeyin dahili asenkron metotlarını kullanmak olacaktır, bu yüzden normal iş parçacıklarından ziyade IOCP'yi kullanabilirsiniz. Yani, NetworkStream için, BeginRead(...) vb. Kullanırsınız.

Daha sonra her şeye birlikte katılmanız gerekir. Daha çok yol var; Ben şahsen ben yönetilmeyen kod gitmeden önler gibi Monitor.Wait ve Monitor.Pulse kullanmak eğilimindedir (birçok bekletme kolları aslında OS tarafından sağlanan).

Ayrıca dikkat: iş parçacığı/paralellik, başarısızlığın birçok eğlenceli yolunun yanında bir paket içinde gelir; normalde sadece senkronizasyon için statik yöntemleri/veri hakkında endişelenmenize gerek vardır, ancak tek bir istekte birden fazla iş parçacığınız varsa bir şey yapıyor: çarpmalara dikkat edin ... çok var.

.NET'in bir sonraki sürümü, süreklilikleri çok daha kolay hale getirmektir; Mevcut deneysel kodu IOCP senaryolarına ne kadar kolay uygulayabileceğimizi görmem gerekiyor.

+3

Güzel Marc, bu kesinlikle sadece soruya cevap yerine biraz daha fazla rehberlik verir böyle bir soruyu cevaplamak için bir yoldur. –

+0

"Bir web sunucusu zaten son derece dişli olduğunu" - Bu hat benim uygulama için birden fazla aramaları önlemek yaptı. Teşekkürler!! – xameeramir

İlgili konular