2012-02-23 70 views
0

目前我面臨着我無法大量的工作和搜索後,解決一個問題,我問過類似的問題,但沒有得到任何答覆,也許是因爲我沒有正確地問它,所以我刪除了這個問題。在ASP.net + C#.NET互斥訪問

好吧我正在使用MailBEE.net對象庫下載電子郵件,它的工作正常,除非如果再次調用下載方法,而前一個調用仍處於下載階段,則兩個消息副本開始下載,這是錯誤的。

的ASP.net頁面上

我打電話說電子郵件下載一個ASHX處理程序

public class sync : IHttpHandler { 
    public void ProcessRequest(HttpContext context) 
    { 
     ApplicationData.layer Functions = new layer(); 
     context.Response.ContentType = "text/text"; 
     int messageCount = Convert.ToInt16(context.Request.QueryString["messageCount"]); 
     if (Functions.SyncMail("email", "user", "password", "pop.gmail.com", messageCount) == "Successful") 
     { 
      context.Response.Write("New Messages Downloaded."); 
     } 
     //context.Response.Write("Hello World"); 
    } 
} 

我打電話使用jQuery從另一個(ASPX)頁以上ASHX處理程序

<script type="text/javascript"> 
     $(document).ready(function() { 
      asyncLoad(); 
     }); 
     function asyncLoad() { 
      document.getElementById("CustomerDetails").innerHTML = "<img alt='' src='Images/ajax-loader.gif' />" + "&nbsp;&nbsp;<span>Downloading New Messages...</span>"; 
      $('#CustomerDetails').load("sync.ashx?messageCount=" + "10"); 
      callAgain(); 
     } 
     function callAgain() { 
      setInterval(asyncLoad, 20000); 
     } 
</script> 

的目的是在一段時間(20000延遲)後繼續調用sync.ashx來檢查新消息,問題是如果sync.ashx的一個呼叫在下載消息中忙於在此期間進行新呼叫,則它開始下載相同的消息副本,因爲它找不到ema的ID數據庫中的前一個電話將要發出。

我需要某種形式的互斥訪問,如果一次通話是在忙下載郵件然後另一個呼叫不應進行。

喜歡的東西

if(IsAlreadyDownloading == False) 
{ 
Functions.SyncMail(params) 
} 

凡IsAlreadyDownloading是一個全球性的標誌或互斥應設置爲true,一旦一個呼叫開始下載和設置假,一旦它完成下載或已經發生了一些異常,表明另一個呼叫可安全地做。

因爲它是一個ASP.net應用程序,我們不知道什麼時候用戶將導航從開始下載呼叫,什麼時候會返回到該頁面,以便再次調用下載處理程序應進行或不離開當前頁面。

我不知道我是否正確解釋了它,但我希望有人能理解。謝謝。

回答

0

最後經過多次揪頭髮和頭部劃傷我設法解決這個問題,我不知道這是否是最好的解決辦法,但至少它現在能正常使用,如果你知道一個更好的解決方案,請在這裏分享,謝謝。

這裏是我的解決方案。

我使用Global.asax中聲明應用級命名全局變量如下

void Application_Start(object sender, EventArgs e) 
{ 
    // Code that runs on application startup 
    Application["IsAlreadyDownloading"] = false; 
} 

目的是模仿互斥樣的行爲和我離開sync.ashx文件,另造一個aspx文件時,從ashx文件轉換的原因是訪問應用程序級別變量IsAlreadyDownloading,它在通用處理程序中不可用。 aspx文件的代碼如下

<%@ Page Language="C#" %> 
<%@ Import Namespace="ApplicationData" %> 
<script runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     int messageCount = Convert.ToInt16(Request.QueryString["messageCount"]); 
     ApplicationData.layer Functions = new layer(); 
     try 
     { 
      if (!Convert.ToBoolean(Application["IsAlreadyDownloading"])) 
      { 
       Application["IsAlreadyDownloading"] = true; 
       if (Functions.SyncMail("email", "user", "password", "pop.gmail.com", messageCount) == "Successful") 
       { 
        Response.Write("New Messages Downloaded."); 
        Application["IsAlreadyDownloading"] = false; 
       } 
       else 
       { 
        Response.Write("<p>Unable to download some messages</p>"); 
        Application["IsAlreadyDownloading"] = false; 
       } 
      } 
     } 
     finally 
     { 
      Application["IsAlreadyDownloading"] = false; 
     } 
     Response.End(); 
    } 
</script> 

不管有多少次,我們撥打電話到該頁面的方法是行不通的,因爲它會發現,如果IsAlreadyDownloading =真法的另一個電話是忙於工作,儘快因爲它將完成它將再次設置IsAlreadyDownloading = false,所以一個新的電話可以獲得它。

希望這可以幫助有人在類似的問題。

服務器