这是否可以作为启动后台工作的方式,我可以在不关心结果的情况下取消该工作?

时间:2019-04-29 21:23:46

标签: c# asynchronous

我正在使用C#工具在运行某些查询/存储过程序列时模拟数据库上正在进行的工作负载,以便评估那些查询/存储过程的性能。我想做的是在数据库上启动一组永久的基本SELECT / INSERT / UPDATE查询,启动要测试性能的存储过程,等待存储的过程完成,然后取消SELECT / INSERT / UPDATE查询。我现在所拥有的是:

public static async Task Main(string[] args) 
{
    // this inserts work items, triggering the stored procs under test
    await StartItemProcessing();

    var cancellationSource = new CancellationTokenSource();
    var cancellationToken = cancellationSource.Token;

    // async method, called without await
    StartQueries(cancellationToken);

    // this polls the database, checking for completion of the stored procs
    await CheckForProcessingCompletion();

    cancellationSource.Cancel();
}

private static async Task StartQueries(CancellationToken cancellationToken)
{
    while(!cancellationToken.IsCancellationRequested)
    {
        // run async database queries with SqlClient
        // awaiting the results and passing cancellationToken to the various async method calls
    }
}

我想会发生的是,当调用StartQueries()时,数据库查询将在while循环中开始运行,而执行将继续通过Main()进行。一旦执行cancellationSource.Cancel(),正在执行的查询将被取消,while循环的条件将变为false,一切都将顺利关闭。这是会发生什么事的正确心理模型吗?这是我在C#中要做的惯用方式吗?

1 个答案:

答案 0 :(得分:1)

您基本上已经掌握了它,但是应该使用变量存储通过调用Task创建的StartQueries,并在调用await之后Cancel对其进行存储。这样,您可以确保StartQueries完成预期的操作。

// async method, called without await
var queryTask = StartQueries(cancellationToken);

// this polls the database, checking for completion of the stored procs
await CheckForProcessingCompletion();

cancellationSource.Cancel();
await queryTask;