簡體   English   中英

如何在 IHostedService 的后台同時運行多個任務

[英]How to run multiple tasks simultaneously in the background of a IHostedService

我有一個 ASP.NET 核心應用程序,它運行IHostedService class 作為后台工作人員。 現在我有兩個無休止地運行的任務。

  • 任務 1:有一個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);
        }

    }

}

在第二個任務運行之前不要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM