我正在使用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#中要做的惯用方式吗?
答案 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;