[英]How to run multiple tasks simultaneously in the background of a IHostedService
我有一個 ASP.NET 核心應用程序,它運行IHostedService
class 作為后台工作人員。 現在我有兩個無休止地運行的任務。
現在我的問題是:如何讓這兩個任務同時運行。 因為現在 Task1 正在阻止 Task2 執行。 任何有關如何更好地解決此問題的幫助或建議將不勝感激。
托管服務
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));
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.