Как заменить SqlCommand.BeginExecuteReader в .NET Core 2.x? - PullRequest
1 голос
/ 02 апреля 2019

Я использовал System.Data.SqlClient.SqlCommand.BeginExecuteReader для асинхронных вызовов базы данных в .NET Framework 4.x, как показано здесь:

use! reader = Async.FromBeginEnd(CommandBehavior.SingleRow, 
         (fun (arg,callback,stateObject) -> cmd.BeginExecuteReader(callback,stateObject,arg)), cmd.EndExecuteReader)

Я пытаюсь перенести этот код в .NETCore 2.2, и я вижу, что методы BeginExecuteReader и EndExecuteReader больше не доступны, как упоминалось здесь .Что можно использовать из .NET Core 2.2, чтобы обеспечить такую ​​же функциональность?

1 Ответ

2 голосов
/ 03 апреля 2019

Даже в .NET 4.0 предпочтительным способом асинхронного выполнения команды было использование одного из методов ExecuteXXXAsync, которые возвращали Задачу.Begin/End методы использовались в более ранних средах, в которых не было Task.

В F # ExecuteReaderAsync можно вызывать в асинхронном рабочем процессе :

let work = async {
    // Open connection
    use conn = new SqlConnection(connectionString)
    do! conn.OpenAsync() |> Async.AwaitVoidTask

    // Execute command
    use cmd = new SqlCommand(queryText,conn)
    use! reader = cmd.ExecuteReaderAsync() |> Async.AwaitTask

    while reader.Read() do
        // Consume reader
        ...
}
work |> Async.RunSynchronously

F # асинхронные рабочие процессы были созданы до типа Task в .NET 4.0, поэтому функции Async.AwaitTask и Async.AwaitVoidTask используются для перенаправления друг друга

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...