如何 运行 在 IHostedService 的后台同时执行多个任务
How to run multiple tasks simultaneously in the background of a IHostedService
我有一个 ASP.NET 核心应用程序,它 运行 是一个 IHostedService
class 作为后台工作者。现在我有两个任务 运行 没完没了。
- Task1:有一个WebSocket连接,不断接收数据并使用EF Core存储在MSSQL数据库中
- Task2:运行一个无限循环,每 10 秒 运行s 遍历已添加到 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));
}
}
}
}
我有一个 ASP.NET 核心应用程序,它 运行 是一个 IHostedService
class 作为后台工作者。现在我有两个任务 运行 没完没了。
- Task1:有一个WebSocket连接,不断接收数据并使用EF Core存储在MSSQL数据库中
- Task2:运行一个无限循环,每 10 秒 运行s 遍历已添加到 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));
}
}
}
}