【发布时间】:2021-10-19 04:51:26
【问题描述】:
我有一个在 s3 中下载和上传 img 的服务,它在本地调试模式下工作并循环 24.7,但是每当我在 QA 或 PROD 中部署它时,它会在 1 个循环后立即退出。我认为这与内存或 s3 不允许连续保存有关,但是当我注释除第一行和最后一行之外的所有代码时,我确认它只运行了一次。
这里是调用循环服务的program.cs
static class Program
{
private static ILogger Logger = new ServiceLogHelper();
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
#if (DEBUG)
Library.Code.Utility.EnvironemntUrl = "http://localhost";
#elif (QA)
Library.Code.Utility.EnvironemntUrl = "http://qa.somesite.com";
#elif (PROD)
Library.Code.Utility.EnvironemntUrl = "http://prod.somesite.com";
#endif
// Set Environment
if (args.Length > 0)
{
var enviromentArgument = args[0];
if (enviromentArgument.StartsWith("-"))
{
enviromentArgument = enviromentArgument.Substring(1);
}
Logger.WriteLine("enviromentArgument " + enviromentArgument + " " + DateTime.Now);
Library.Code.Utility.EnvironemntUrl = new UriBuilder(enviromentArgument).Uri.ToString();
}
#if (!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new ImageSomeService()
};
ServiceBase.Run(ServicesToRun);
#else
var service = new ImageSomeService();
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#endif
}
}
这里是循环服务
public partial class ImageSomeService : ServiceBase
{
public ImageSomeService()
{
InitializeComponent();
OnStart(new string[] { });
}
private bool Started { get; set; }
protected override void OnStart(string[] args)
{
Started = true;
do
{
ImageSvcHelper.RunBatch();
System.Threading.Thread.Sleep(10000);
}
while (Started);
}
protected override void OnStop()
{
Started = false; //i put logger here but it was never printed so it means it didn't stop
}
}
下面是助手,我发现它只运行一次,因为它只在记录器中打印一次。但如果我在本地处于调试模式(通过 Visual Studio 运行),"Image service running in ...." 行会无限打印,直到我停止它。
public static class ImageSvcHelper
{
public static bool RunBatch()
{
Logger.WriteLine("Image caching running in " + Library.Code.Utility.Environment + " " + DateTime.Now);
var minID = AppHelper.GetValue<int>(group: "LastImgID", key: "ImgID");
Logger.WriteLine("minid " + minID + " " + DateTime.Now);
// some codes here
System.Threading.Thread.Sleep(30000);
return true;
}
}
【问题讨论】:
-
你怎么知道你没有得到异常?
-
OnStart应该启动一个新线程并返回。 -
@TheGeneral 对不起,我缩短了我的代码,那里有一个 try catch 但没有得到任何打印。记录器只打印了一行“图像服务正在运行...”然后什么也没有。
标签: c# service console-application