2012-02-23 71 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,所以一个新的电话可以获得它。

希望这可以帮助有人在类似的问题。

服务器