Извините за мой плохой английский, был бы признателен, если кто-нибудь может помочь мне исправить.
Я написал службу Windows, чтобы получать транзакции из базы данных и экспортировать их в обычный файл для отправки в другую систему через sftp,Эта услуга была запущена в течение 6 месяцев без каких-либо проблем.Мой код выглядит примерно так:
Я использовал логическую переменную с именем _isProcessOutwardMessage
, чтобы проверить, запущен ли поток для запуска нового потока (processOutwardMessageThread
).Было 5 флагов и 5 подобных тем (но я удалил 4, чтобы сохранить мой пост коротким)
Моя проблема в том, что примерно через 6 месяцев ИТ-специалисты что-то сделали на сервере (он сказал, что этозакалка).После этого обновления мой сервис столкнулся с ошибкой.Когда я проверил журнал, я обнаружил, что один и тот же поток (например: processOutwardMessageThread
) был выполнен дважды в одно и то же время (похоже, флаг больше не работает).Это неверно, потому что он может быть запущен только после завершения предыдущего потока (флаг был установлен в false).
Я попытался перезапустить службу, но она работает нормально только около 1 часа, после этого снова возникает ошибка.Пожалуйста, дайте мне совет.Спасибо
using Timer = System.Timers.Timer;
namespace FastOne.Payment.MessageService
{
internal partial class ProcessMessageService : ServiceBase
{
private Timer _processOutwardMessageTimer;
public ProcessMessageService()
{
InitializeComponent();
}
private void LoadConfiguration()
{
try
{
_processOutwardMessageInterval =
int.Parse(ConfigurationManager.AppSettings["ProcessOutwardMessageInterval"]);
//Running flag
_isProcessOutwardMessage = false;
}
catch (Exception exception)
{
ProcessServiceLogger.Error(exception);
}
}
protected override void OnStart(string[] args)
{
//Load configs
LoadConfiguration();
_processOutwardMessageTimer = new Timer(_processOutwardMessageInterval);
_processOutwardMessageTimer.Elapsed += ProcessOutwardMessageTimer_Elapsed;
_processOutwardMessageTimer.Start();
}
private void ProcessOutwardMessageTimer_Elapsed(object sender, ElapsedEventArgs e)
{
if (!_isProcessOutwardMessage)
{
var processOutwardMessageThread = new Thread(ProcessOutwardMessage);
processOutwardMessageThread.Start();
}
}
private void ProcessOutwardMessage()
{
try
{
ProcessOutwardMessageWithTransaction();
}
catch (Exception exception)
{
ProcessOutwardMessageLogger.Info("FAILED! ROLLBACK TRANSACTION!");
ProcessOutwardMessageLogger.Error(exception);
}
}
private void ProcessOutwardMessageWithTransaction()
{
//Set flag to true
_isProcessOutwardMessage = true;
//Do something here
WriteLogToFile("Thread Execute.");
//Set flag to false
_isProcessOutwardMessage = false;
}
}
}