我有一个带有Queue
类的webapi .NET Core应用程序,该应用程序不断循环遍历List<Item>
对象,其中Item
是数据模型的包装,并包含一些元数据异步执行一些任务。这个Queue
类需要在控制器中可以访问,并且我已经正确地在DI框架中注册了它。我的问题是,我需要使BeginProcessing
方法在应用程序启动时开始运行,并且传递给控制器的实例必须与运行该方法的实例相同,并且我不确定最好的方法。任何帮助表示赞赏。此上下文中未包含的所有内容(例如Program
等都仍然是默认设置。
请参阅下文。
Queue.cs:
public class Queue : IQueue
{
public List<Item> Items { get; set; }
public void BeginProcessing()
{
while(true)
{
if (!(Items.Count < 1))
{
Item Item = Items[0];
if (!Item.Push())
{
Console.WriteLine("Generic Error Message, not final implementation.");
}
Items.Remove(Item);
}
}
}
}
Item.cs
public class Item
{
public SomeDataModel Data { get; set; }
public string Topic { get; set; }
public string Timestamp { get; set; }
public Item(SomeDataModel newData, string newTopic, string newTimestamp)
{
Data = newData;
Topic = newTopic;
Timestamp = newTimestamp;
}
public bool Push()
{
Producer p = new Producer("identifier");
return p.Ingest(Data);
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSingleton<IQueue, Queue>();
}
答案 0 :(得分:1)
您应该创建一些后台工作程序来处理队列线程。
x = x.__iadd__(y)
这将使调用线程陷入无限循环。尝试使用任务或背景工作者。您甚至可以将其放入自己的队列中,以将其从主应用程序中隐藏起来。
要从开始启动BeginProcessing,请获取构建的容器并查询IQueue。调用IQueue.BeginProcessing()并继续正常启动。如果一切正常,只要将IQueue注入到控制器中,它就会与您开始BeginProcessing时使用的相同,并且您应该可以在控制器上下文中访问它
答案 1 :(得分:0)
我最终找到了我的用例的解决方案,而不必依赖荒谬的抽象或.NET框架中其他晦涩的部分。无论是最佳实践,我都不知道。但是它可以正常工作并满足我的需求,最终,这就是每个人真正想要的。
我的解决方案:
在DI框架中注册Singleton,将依赖项注入Configure
方法中,然后将处理方法启动到另一个线程中。
Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSingleton<IQueue, Queue>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IQueue queue)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
Task.Run(() => queue.BeginProcessing());
app.UseHttpsRedirection();
app.UseMvc();
}