如何在IHostedService的后台同时运行多个任务



我有一个ASP.NET Core应用程序,它作为后台工作程序运行IHostedService类。现在我有两个无休止运行的任务。

  • Task1:有一个WebSocket连接,它可以连续接收数据,并使用EF Core将数据存储在MSSQL数据库中
  • Task2:运行一个无休止的循环,每10秒在Task1中添加到数据库的事务上运行一次

现在我的问题是:
如何让这两个任务同时运行?因为现在Task1正在阻止Task2执行。对于如何更好地解决这个问题的任何帮助或建议,我们将不胜感激。

IHostedService

public async Task StartAsync(CancellationToken cancellationToken)
{
await Task1();
new Thread(Task2).Start();
}
public async Task Task1()
{
using (var client = new StreamingWebSocketClient("wss://websocket.io"))
{
//Receive data from Websocket and store in MSSQLDB using EF Core
}
}
private void Task2()
{
using (_dbContext)
{
while (true)
{
var transactions = _dbContext.Transactions.Where(t => t.To == null).ToList();
foreach (Models.Transaction transaction in transactions)
{
//Do some work
}
Thread.Sleep(10000);
}
}
}

在第二个任务运行之前不要await第一个任务:

public async Task StartAsync(CancellationToken cancellationToken)
{
var task1 = Task1();
var task2 = Task.Run(() => Task2());
await Task.WhenAll(task1, task2);
}

这样做会稍微好一点:

public async Task StartAsync(CancellationToken cancellationToken)
{
var task1 = Task1();
var task2 = Task2(cancellationToken);
await Task.WhenAll(task1, task2);
}

private async Task Task2(CancellationToken cancellationToken)
{
using (var dbContext = new DbContext())
{
while (true)
{
if (cancellationToken.IsCancellationRequested)
{
break;
}
else
{
var transactions = dbContext.Transactions.Where(t => t.To == null).ToList();
foreach (Models.Transaction transaction in transactions)
{
//Do some work
}
await Task.Delay(TimeSpan.FromSeconds(10.0));
}
}
}
}

最新更新