2010-07-15 26 views
1

我在頁面上有兩種方法。一個AddMessageToInboxOutbox(params [])和另一個SendNewMessageMail(params [])。使用asp.net的異步方法?

一旦用戶發送消息到其他第一條消息被添加到數據庫,然後發送到收件人的電子郵件。有時SMTP負載很重,需要5秒才能從中獲得答案。我想使用其他線程或其他東西來附加SendNewMessageMail(params [])和異步調用。我從來沒有這樣做過。

如何在ASP.NET中執行此操作?

回答

2

您可以使用委託異步調用的方法:

delegate void SendMailAsync(params object[] args); 

static void Main() 
{ 
    SendMailAsync del = new SendMailAsync(SendMail); 
    del.BeginInvoke(new object[] { "emailAddress" }, null, null); 
} 

static void SendMail(params object[] args) 
{ 
    // Send 
} 

這將使用ThreadPool指定另一個線程。在我的例子中,我也沒有註冊回調。請注意,如果指定此回調,它將被置於未知ThreadPool線程上。在委託參考del上調用EndInvoke將會阻塞,直至完成。

EndInvoke需要的是從BeginInvoke方法返回的IAsyncResult對象,如果你這樣做,留着給delIAsyncResult引用。此外,這不是特定於ASP.NET。

注:多線程是一個強大的機制和深入學習的主題。由於頁面生命週期等原因,將多線程與ASP.NET耦合可以說比WinForms應用程序更爲複雜。我建議閱讀整個多線程主題。

+0

+1有關多線程的說明。 – driis 2010-07-15 08:27:38

+0

將在ASP.NET應用程序中使用。點是什麼時發生頁面回帖? ASync調用是否會繼續運行? – eugeneK 2010-07-15 09:03:08

+0

如果頁面加載不會阻止返回並且頁面返回給客戶端,我認爲它會運行,但結果將毫無意義,因爲頁面生命週期已完成並被回收。但是,如果沒有需要返回,它可能仍然完成(不知道線程中止等)。試試吧,讓我們知道:-)你可以通過Thread.Sleep()模擬很長一段時間來模擬未完成的線程。 – 2010-07-15 17:44:02

1

或者,看看ParamaterizedThreadStart

+0

因此,我可以打開郵件本身的新線程並保留其他功能,因爲它是? – eugeneK 2010-07-15 09:01:02