以下は、私が問題を抱えているコードの簡略版です。これをコンソールアプリケーションで実行すると、期待どおりに機能します。すべてのクエリは並行して実行され、Task.WaitAll()
すべて完了すると返されます。
ただし、このコードをWebアプリケーションで実行すると、リクエストはハングします。デバッガーを接続してすべてを壊すと、実行が待機していることが示されTask.WaitAll()
ます。そして、最初のタスクは完了しましたが、他のタスクは決して完了しません。
ASP.NETで実行するとハングする理由がわかりませんが、コンソールアプリケーションでは正常に機能します。
public Foo[] DoWork(int[] values)
{
int count = values.Length;
Task[] tasks = new Task[count];
for (int i = 0; i < count; i++)
{
tasks[i] = GetFooAsync(values[i]);
}
try
{
Task.WaitAll(tasks);
}
catch (AggregateException)
{
// Handle exceptions
}
return ...
}
public async Task<Foo> GetFooAsync(int value)
{
Foo foo = null;
Func<Foo, Task> executeCommand = async (command) =>
{
foo = new Foo();
using (SqlDataReader reader = await command.ExecuteReaderAsync())
{
ReadFoo(reader, foo);
}
};
await QueryAsync(executeCommand, value);
return foo;
}
public async Task QueryAsync(Func<SqlCommand, Task> executeCommand, int value)
{
using (SqlConnection connection = new SqlConnection(...))
{
connection.Open();
using (SqlCommand command = connection.CreateCommand())
{
// Set up query...
await executeCommand(command);
// Log results...
return;
}
}
}