Windowsフォームのイベントハンドラ上でEntityFramework6のToListAsync()がawaitできない


Windowsフォームのイベントハンドラにて、EntityFramework6でDBクエリを実行しています。

ToListAsync()にawaitキーワードをつけて非同期実行とし、CancellationTokenを渡して処理のキャンセルを可能としています。  
しかしながら、下記コードで実行してみると、クエリの完了までUI操作がブロックされます。

意図した動作にならない原因は何なのでしょうか。

[code]

    private async void button1_Click(object sender, EventArgs e)
    {
        _cts = new CancellationTokenSource();
    
        using (var db = new SampleEntities())
        {
            // ここでawaitするがUIに制御が渡らない
            _result = await db.Database.SqlQuery<Result>("select fullname,productname from customers, products").ToListAsync(_cts.Token);
        }
    
        dataGridView1.DataSource = _result;
        statusLabel.Text = $"{_result.Count} records loaded.";   
    }
    
[/code]




原因は、使用したDBドライバ(Oracle.ManagedDataAccess)が非同期クエリをサポートしていないためでした。  
接続先をSQL Serverに変更したら、コードはそのままで非同期実行できました。

なお、ドライバが非同期クエリをサポートしていない場合でも、  
下記のようにTask.Runで明示的に別スレッド実行すれば非同期実行は実現可能です。  
ただし、タスクをキャンセルした際に安全に処理が終了されていないかもしれません。

[code]

    private async void button1_Click(object sender, EventArgs e)
    {
        _cts = new CancellationTokenSource();
        var task = Task.Run<List<Result>>(async () =>
        {
            return await _db.Database.SqlQuery<Result>("select fullname,productname from customers, products").ToListAsync(_cts.Token);
        });
        _result = await task;
        dataGridView1.DataSource = _result;
        statusLabel.Text = $"{_result.Count} records loaded.";   
    }
    
[/code]




原因は、使用したDBドライバ(Oracle.ManagedDataAccess)が非同期クエリをサポートしていないためでした。  
接続先をSQL Serverに変更したら、コードはそのままで非同期実行できました。

なお、ドライバが非同期クエリをサポートしていない場合でも、  
下記のようにTask.Runで明示的に別スレッド実行すれば非同期実行は実現可能です。  
ただし、タスクをキャンセルした際に安全に処理が終了されていないかもしれません。

[code]

    private async void button1_Click(object sender, EventArgs e)
    {
        _cts = new CancellationTokenSource();
        var task = Task.Run<List<Result>>(async () =>
        {
            return await _db.Database.SqlQuery<Result>("select fullname,productname from customers, products").ToListAsync(_cts.Token);
        });
        _result = await task;
        dataGridView1.DataSource = _result;
        statusLabel.Text = $"{_result.Count} records loaded.";   
    }
    
[/code]

