SORU
23 Mart 2009, PAZARTESİ


Çalışan zaman uyumsuz bir işlem ASP.NET web sayfası isteği tarafından tetiklenen

Çeşitli nedenlerle ASP.NET web sayfası için HTTP aramayı kullanarak tetiklenmesi gerekir o zaman uyumsuz bir işlem var. Benim sayfa istendiğinde, bu işlemi başlatmak ve hemen müşteri bildirim dönmelidir.

Bu yöntem, XML web servisi üzerinden maruz kalmaktadır, ve mükemmel çalışıyor.

Benim ilk denemem, bir istisna, bana atıldı:

Asynchronous operations are not allowed in this context.
Page starting an asynchronous operation has to have the Async
attribute set to true and an asynchronous operation can only be
started on a page prior to PreRenderComplete event.

Elbette @Page Resmi Gazete Async="true" parametre ekledim. Şimdi, bir hata almıyorum ama sayfa zaman Uyumsuz işlem tamamlanana kadar bloke ediyor.

Nasıl bir gerçek olsun ateş ve unut sayfa çalışıyor muyum?

Düzenleme:Daha fazla bilgi için bazı kod. Bu biraz daha karmaşık, ama orada genel bir fikir edinmek için çalıştım.

public partial class SendMessagePage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string message = Request.QueryString["Message"];
        string clientId = Request.QueryString["ClientId"];

        AsyncMessageSender sender = new AsyncMessageSender(clientId, message);
        sender.Start();

        Response.Write("Success");
    }
}

AsyncMessageSender sınıfı:

public class AsyncMessageSender
{
    private BackgroundWorker backgroundWorker;
    private string client;
    private string msg;

    public AsyncMessageSender(string clientId, string message)
    {
        this.client = clientId;
        this.msg = message;

        // setup background thread to listen
        backgroundThread = new BackgroundWorker();
        backgroundThread.WorkerSupportsCancellation = true;
        backgroundThread.DoWork  = new DoWorkEventHandler(backgroundThread_DoWork);
    }

    public void Start()
    {
        backgroundThread.RunWorkerAsync();
    }

    ...
    // after that it's pretty predictable
}

CEVAP
23 Mart 2009, PAZARTESİ


TAMAM, burada sorun şu: zaman Uyumsuz özniteliği için dava nerede sayfasıdır arayacak bazı uzun soluklu görev de blok iplik, ve sonra sayfanızı ihtiyacı çıktı bu görev için geri dönmek bilgi için Kullanıcı. Eğer sayfanızın bir web hizmetini çağırmak gerekirse, örneğin, yanıt bekleyin ve sonra gelen yanıt verileri sayfası oluşturmak için kullanın.

Zaman Uyumsuz özniteliği kullanmak istiyorum nedeni iş parçacığı engelleme önlemek için. Bu ASP.NET uygulama isteklerine hizmet vermek için bir iş parçacığı havuzu kullanmak için, sadece kullanılabilir iş parçacığı nispeten az sayıda vardır. Ve eğer her arama bağladı iplik sırada bekleyen web servis çağrısı, o zaman yakında vuracaksın yeterli eşzamanlı kullanıcılar kullanıcılar gerekecek bekleyin bu web hizmeti çağrıları tamamlayın. Zaman Uyumsuz öznitelik iş parçacığı için iş parçacığı havuzu dönmesini sağlar ve web sitenizin, web hizmeti çağrısı dönmesini beklerken hiçbir şey yapmadan oturup zorlamak yerine diğer eşzamanlı ziyaretçilere hizmet.

Bu sizin için sonuçta Uyumsuz özniteliği zaman uyumsuz görev tamamlanıyor ve bu sayfa hemen işlemek değil, neden bu kadar sayfa oluşturabilirsiniz. orada çalışması için tasarlanmıştır.

Kendi iş parçacığı başlatmak ve daemon bir konu yapmak gerekir. Bunun için tam sözdizimi hatırlamıyorum, ama kolayca için KÜÇÜK doktor arama doktor bulabilirsiniz "". daemon Bu demektir iplik tutacak uygulama kapatılıyor olsa da, hayatta olduğu önemli çünkü ASP.NET ve IIS hakkı saklıdır "geri dönüşüm süreci" gördükleri zaman gerekli, ve eğer bu durumda iken iplik çalışıyor, Senin görevin olacak durdu. Konu daemon yapmak, bu (olası bazı nadir kenar durumlarda ... bu belgeleri bulmak daha öğrenirsin hariç) engelleyecektir.

Daemon thread bu görevleri başlaması yerdir. Ve daemon iş parçacığı görev yapmak anlattıktan sonra, hemen sayfanın hemen işleme olacak sayfana bir hale ... yapabilirsiniz.

ASP.NET sürecinde daemon bir iplik bile daha iyi olsa da, uygulamak olurdu görev yapmak için bir Windows Hizmeti. ASP.NET uygulamanız görev Hizmeti için gerçekleştirilecek iletişim kurmak. Daemon bir iplik ve ASP.NET süreci geri dönüşümlü olma konusunda endişelenmenize gerek yok. Servis nasıl görev yapsın? Hizmet yokladığı bir veritabanı tablosuna bir kayıt ekleyerek XML yoluyla belki, ya da belki de. Ya da başka şekillerde bir dizi.

Burada başka bir fikir, bu çok aynı amaç için daha önce kullanmış olan. EDİT: Bir MSMQ kuyruğuna görev hakkında bilgi yazmak. Başka bir işlem (belki başka bir makine bile bunu yapan sıradan bir çekme var ve zaman alıcı bir görev. Kuyruğa ekleme iş parçacığı Sıraya koymak veriler öyle Tel falan üzerinden gönderilen iken engellemez bu yüzden mümkün olduğunca çabuk dönmek için hazırdır. Bir görev bu görev için yürütülecek beklemeden yapılması gereken aslında not yapmak için en hızlı yollarından biridir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Air_Fooj

    Air_Fooj

    24 NİSAN 2009
  • thenewboston

    thenewboston

    4 ŞUBAT 2008
  • TimMinchinLive

    TimMinchinLi

    23 ŞUBAT 2009