Tag: 服务

使用multithreading服务的数据库连接池

我有一个.NET 4 C#服务,它使用TPL库进行线程化。 我们最近将其切换为也使用连接池,因为一个连接正在成为处理的瓶颈。 以前,我们使用lock子句来控制连接对象的线程安全性。 当工作备份时,队列将作为任务存在,并且许multithreading(任务)将等待lock子句。 现在,在大多数情况下,线程会更快地等待数据库IO和工作进程。 但是,现在我正在使用连接池,我们遇到了一个新问题。 达到最大连接数(默认值为100)后,如果请求进一步连接,则会超时(请参阅池信息 )。 发生这种情况时,会抛出一个exception,说“连接请求超时”。 我的所有IDisposable都在using语句中,我正在管理我的连接。 这种情况的发生是由于请求的工作量超过了池可以处理的工作量(这是预期的)。 我理解为什么会抛出这个exception,并且我知道处理它的方法。 简单的重试感觉就像一个黑客。 我也意识到我可以通过连接字符串增加超时时间,但这不是一个可靠的解决方案。 在以前的设计中(没有池),工作项将因应用程序内的锁定而处理。 处理此方案以确保处理所有工作的好方法是什么?

为什么System.Threading.Timer自行停止?

在Windows服务项目中使用System.Threading.Timer之前,我正在做一个小型测试项目。 它工作得非常好,但计时器会在一两分钟后自行停止。 测试项目的完整来源是: using System; using System.Windows.Forms; using System.Threading; namespace studyTimers { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { TimerCallback timerDelegate = new TimerCallback(tick); System.Threading.Timer testTimer = new System.Threading.Timer(timerDelegate, null, 1000, 1000); } void tick(Object obj) { if (label1.InvokeRequired) { label1.Invoke(new MethodInvoker(() => […]

ASP.NET Fire和忘记(单向)Web服务

我在ASP.NET中创建了一个常规的旧ASMX Web服务,并将SoapDocumentMethod(OneWay = true)]添加到函数调用中,因为我已经读过这应该调用Asynchronous。 但是我在我的代码中调用它,它肯定不会使调用异步,我的页面只是坐在那里等待函数完成工作。 是什么赋予了? [SoapDocumentMethod(OneWay = true)] [WebMethod(EnableSession = true)] public void UpdateAccounts() { //do work } //call the function GlobalServices service = new GlobalServices(); service .UpdateAccounts()

一个Windows服务中的多个服务进程(System.ServiceProcess.ServiceBase)

我有两个服务进程(派生自System.ServiceProcess.ServiceBase ) MyService1和MyService2 。 我正在尝试在Windows服务的Programm.cs的Main()中运行它们。 static void Main() { ServiceBase[] servicesToRun = { new MyService1(), new MyService2() }; ServiceBase.Run(servicesToRun); } 在MyService1和MyService2的OnStart方法中,我写入日志文件,以便我可以告诉它们正在运行。 系统构建良好,我可以安装该服务。 但只有MyService1运行。 MyService2没有做任何事情(即没有启动日志条目)。 当我更改数组中的顺序时: ServiceBase[] servicesToRun = { new MyService2(), new MyService1() } 只有MyService2运行。 为了试图深究这一点,我正在使用一个小工具AndersonImes.ServiceProcess.ServicesLoader( https://windowsservicehelper.codeplex.com/ )来解决您无法在Visual Studio中直接调试Windows服务的限制。 使用此工具,我可以使两个服务MyService1和MyService2一起启动并运行。 但我仍然不知道为什么Windows只运行ServiceBase[] servicesToRun数组中的第一项。 有任何想法吗?

服务层(.NET应用程序)中的授权和用户信息

我目前正在使用.NET环境中的企业应用程序(n-layered),我想知道在BussinessLayer(BL)中管理身份validation/授权+数据过滤的最佳方法。 我们将使用来自多个接口(ASP.NET应用程序和Web服务)的BL,我认为我的ServiceLayer应该完成这项工作,但我找不到最好的方法。 我想它可能是这样的:(1)用户可能使用FormsAuthentication进行身份validation(ASP.NET Web客户端)。 (2)ASP .NET代码(Controller / CodeBehind)实例化服务以完成一些用户案例,以某种方式传递“用户”。 (3)服务方法检查“用户”是否存在(认证)和他的角色(授权)以validation他是否可以调用该方法。 如果未经过身份validation或授权,则会引发exception。 (4)服务使用存储库+其他服务+完成工作所需的任何服务。 如果需要某种细粒度过滤(例如,用户仅对某些项目具有权限),则服务会自动应用它。 我想要的是将ServiceLayer与’web stuff’隔离(不访问会话…),但是谁知道User调用其方法来正确操作。 此外,我不知道如何以良好的方式将该工作与ASP .NET身份validation相匹配……我正在考虑在服务ctor中总结“用户”,以便其方法具有所需的“上下文”,可以那工作?…我会很感激一些迹象或现有的代码片段。 谢谢您的帮助…

在Windows XP中使用C#在登录屏幕上显示窗口

我正在尝试使用C#创建一个服务,启动一个可以在Windows XP登录屏幕上显示的进程。 我发现一些代码在C ++中执行此操作。 C ++代码用于创建另一个进程,STARTUPINFO.lpDesktop设置为“WinSta0 \ WinLogon”。 然后,创建的进程将显示在Windows登录屏幕上。 我似乎找不到使用System.Diagnostic.Process类在C#中指定新进程的“桌面”的方法。 有谁知道如何用C#做到这一点?

Serilog的logger包装器的实现和使用

这个问题与史蒂文的答案有关 – 这里 。 他提出了一个非常好的记录器包装器。 我将在下面粘贴他的代码: public interface ILogger { void Log(LogEntry entry); } public static class LoggerExtensions { public static void Log(this ILogger logger, string message) { logger.Log(new LogEntry(LoggingEventType.Information, message, null)); } public static void Log(this ILogger logger, Exception exception) { logger.Log(new LogEntry(LoggingEventType.Error, exception.Message, exception)); } // More methods here. } 所以,我的问题是创建代理Serilog的实现的正确方法是什么 ? 注意:这个问题与关于log4net的这个问题有关,但现在特定于Serilog。

在域驱动设计中,在域对象中调用其他对象的repostiories会违反DDD吗?

我正在重构一个正在包装的项目的代码,最后我把很多业务逻辑放到服务类而不是域对象中。 此时,大多数域对象仅是数据容器。 我决定在服务对象中编写大部分业务逻辑,然后将所有内容重构为更好,更可重用和更易读的形状。 这样我就可以决定应该将哪些代码放入域对象中,以及将哪些代码分解为自己的新对象,以及应该在服务类中保留哪些代码。 所以我有一些代码: public decimal CaculateBatchTotal(VendorApplicationBatch batch) { IList applications = AppRepo.GetByBatchId(batch.Id); if (applications == null || applications.Count == 0) throw new ArgumentException(“There were no applications for this batch, that shouldn’t be possible”); decimal total = 0m; foreach (VendorApplication app in applications) total += app.Amount; return total; } 这段代码似乎是对域对象的一个​​很好的补充,因为它的唯一输入参数是域对象本身。 似乎是一些重构的完美候选者。 但唯一的问题是该对象调用另一个对象的存储库。 这让我想把它留在服务类中。 我的问题是这样的: […]

从服务启动EXE文件并通过发送SIGBREAK停止它

我写了一个启动java.exe或ruby.exe的服务(我知道有一些解决方案,但出于某些原因我需要自己的服务)。 到目前为止,服务工作找到了,我从注册表收集我的配置,然后启动服务。 当服务停止时,我得到我的进程并发送一个.Kill()。 到现在为止还挺好。 但我发现,.kill()是一个问题,因为ruby.exe(我使用thin启动服务)或java.exe(我用它启动SOLR)监听tcp套接字端口。 如果这个端口被使用并且我终止进程窗口将阻塞端口72秒(按设计)。 如果我执行solr:从shell命令shell启动并启动thin -start并使用Ctrl + C将其停止,则进程终止并且端口可立即使用。 所以我的猜测是:如果我设法向进程发送一个ctrl-c,它就会正确终止。 所以我发现这个post如何从exe服务运行exe并在exe进程退出时停止服务? 发布概念certificate的地方。 但是通过从窗口服务启动进程,我没有windowHandle。 我开始这样的服务: m_process.StartInfo = new ProcessStartInfo { FileName = “java” , Arguments = arguments , UseShellExecute = true , WorkingDirectory = workDirectory , CreateNoWindow = false }; m_process.Start(); 如果参数包含jetty数据以启动SOLR或者在ruby情况下我使用“ruby.exe thin start …”。 现在停止我尝试的服务: [DllImport(“user32.dll”, CharSet = CharSet.Auto)] public static extern IntPtr FindWindow(string […]

警报每次打开应用程序时都会关闭

我无法弄清楚为什么每当我打开我的应用程序时,我的通知设置为关闭闹钟就会被取消。 我只在特定的日期和时间设置日历。 不仅是我的闹钟在日历的指定时间和星期几甚至没有响起。 我的闹钟甚至需要服务吗? 我试图确保即使应用程序关闭也会关闭。 下面的代码(MyService)在MainActivity onCreate()中调用。 [Service] public class MyService : Service { //const int NOTIFICATION_ID = 9000; public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) { SetAlarm(); return StartCommandResult.Sticky; } private void SetAlarm() { //setting Calendar Java.Util.Calendar calendar = Java.Util.Calendar.Instance; calendar.Set(Java.Util.CalendarField.DayOfWeek, 1); calendar.Set(Java.Util.CalendarField.HourOfDay, 02); calendar.Set(Java.Util.CalendarField.Minute, 15); AlarmManager manager = (AlarmManager)GetSystemService(Context.AlarmService); Intent managerIntent; […]