В настоящее время я сталкиваюсь с проблемой, которую не могу решить после большой работы и поиска. Я задавал похожий вопрос раньше, но, возможно, не получил ответа, возможно, потому что не задал его правильно, поэтому удалил этот вопрос. .
Хорошо. Я загружаю электронные письма, используя библиотеку объектов 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");
}
}
Я вызываю вышеупомянутый обработчик ASHX, используя Jquery с другой (ASPX) страницы
<script type="text/javascript">
$(document).ready(function() {
asyncLoad();
});
function asyncLoad() {
document.getElementById("CustomerDetails").innerHTML = "<img alt='' src='Images/ajax-loader.gif' />" + " <span>Downloading New Messages...</span>";
$('#CustomerDetails').load("sync.ashx?messageCount=" + "10");
callAgain();
}
function callAgain() {
setInterval(asyncLoad, 20000);
}
</script>
Цель состоит в том, чтобы через некоторое время продолжать вызывать sync.ashx (задержка 20000) для проверки новых сообщений, проблема в том, что один вызов sync.ashx занят загрузкой сообщений и в это время делается новый вызов. , он начинает загружать идентичные копии сообщений, так как не находит идентификаторы электронных писем в базе данных, которые собирается сделать предыдущий вызов.
Мне нужен какой-то взаимоисключающий доступ, так что если один раз вызов занят загрузкой сообщений, то другой вызов не должен выполняться.
Что-то вроде
if(IsAlreadyDownloading == False)
{
Functions.SyncMail(params)
}
Где IsAlreadyDownloading - это глобальный флаг или мьютекс, который должен быть установлен в True, как только начнется загрузка одного вызова, и будет установлен в ложь, как только закончится загрузка, или возникло исключение, указывающее, что другой вызов может быть выполнен безопасно.
Поскольку это приложение ASP.net, мы не знаем, когда пользователь уйдет со страницы, с которой начинается загрузка, и когда он вернется к этой странице, поэтому следует выполнить другой вызов обработчика загрузки.
Я не знаю, правильно ли я объяснил или нет, но я надеюсь, что кто-то поймет. Спасибо.