我有一個 ASP.NET Core 應用程式,它IHostedService作為后臺作業者運行一個類。現在我有兩個無休止地運行的任務。
- Task1:有一個 WebSocket 連接,可以持續接收資料并使用 EF Core 將其存盤在 MSSQL 資料庫中
- Task2:運行一個無限回圈,每 10 秒運行一次在 Task1 中添加到資料庫的事務
現在我的問題是:如何讓這兩個任務同時運行。因為現在 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);
}
}
}
uj5u.com熱心網友回復:
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));
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/423023.html
標籤:
