繁体   English   中英

C#Web环境中的持久化线程池

[英]Persisted thread pool in c# web environment

我编写了ac#以数据为中心的Web应用程序。
此应用程序需要异步执行某些操作(例如,发送电子邮件,将一些数据传输到外部api),但是我希望它们在发生崩溃/重新启动的任何情况下都能持久存在。
我还想传递一些将被持久化的数据,因此当线程唤醒时,它将具有用于调用的数据。 当我说数据时,我指的是数据上下文,是一些结构化的对象,因此当线程唤醒时,它将具有用于线程操作的数据,例如电子邮件,收件人,主题和正文。

因此,为了使它形象化,这是我可以想到的一个API ...

public interface IAsyncService{
   void QueueWork<T>(object dataContext) where T : IAsyncOperation;
}

public interface IAsyncOperation{
    void ExecuteQueuedWork(object dataContext);
}

.net本机是否可能出现这种情况? 如果不是,您知道其他解决方案吗?

是的,没有。

您不能“坚持线程”。 那根本不可能。 线程是一个低级的东西。

但是,您可以得到预期的结果。 只是坚持工作 ,而不是线程。 作业(或任务,工作项,或您要命名的任何东西)是定义要执行的任务的输入数据集,以及有关进度,临时结果和类似内容的信息(可选)。

如果将“作业”定义为一组输入数据,则将能够拥有一组工人来开始处理作业。 当工作人员崩溃时,假设该工作仍然存在,您将能够启动新工作人员,并使其从头开始再次处理失败的工作。

如果您在“工作”中加入一些临时(部分)结果,那么在崩溃之后,新工作人员可以从保存的点开始工作。

现在,保存点的粒度(如果有的话),“哪个线程完成什么工作”的跟踪,“什么工作完成了而哪些没有完成”的跟踪-完全是您的责任。 您必须自己设计和编写所有这些内容。 这是可行的,不是那么难,但是需要一些计划。

或者,如果运气好的话,您可能会找到workerpool / messagequeueing / etc库。 我现在不记得了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM