sql асинхронная проблема запроса

Чтобы указать ход выполнения действий, попробуйте следующие команды:

while true; do sleep 0.25 && echo -ne "\r\\" && sleep 0.25 && echo -ne "\r|" && sleep 0.25 && echo -ne "\r/" && sleep 0.25 && echo -ne "\r-"; done;

ИЛИ

while true; do sleep 0.25 && echo -ne "\rActivity: \\" && sleep 0.25 && echo -ne "\rActivity: |" && sleep 0.25 && echo -ne "\rActivity: /" && sleep 0.25 && echo -ne "\rActivity: -"; done;

ИЛИ

while true; do sleep 0.25 && echo -ne "\r" && sleep 0.25 && echo -ne "\r>" && sleep 0.25 && echo -ne "\r>>" && sleep 0.25 && echo -ne "\r>>>"; sleep 0.25 && echo -ne "\r>>>>"; done;

ИЛИ

while true; do sleep .25 && echo -ne "\r:Active:" && sleep .25 && echo -ne "\r:aCtive:" && sleep .25 && echo -ne "\r:acTive:" && sleep .25 && echo -ne "\r:actIve:" && sleep .25 && echo -ne "\r:actiVe:" && sleep .25 && echo -ne "\r:activE:"; done;

Можно использовать флаги / переменные внутри цикла while для проверки и отображения значения / степени прогресса.

5
задан bitcycle 25 June 2009 в 20:22
поделиться

2 ответа

Некоторые моменты, которые я заметил:

  1. Метод обратного вызова был вызван только после того, как я удалил WAITFOR DELAY stmt.
  2. Нет необходимости опрашивать result.IsCompleted, потому что Метод обратного вызова запускается только после асинхронная обработка завершена.
  3. Нет необходимости явно устанавливать dr = null в части else, потому что по умолчанию она будет равно null.
  4. Вы должны обработать InvalidOperationException и ArgumentException в HandleCallback метод.
  5. В обратном вызове дескриптора всякий раз, когда вызывается EndExecuteReader () I продолжал получать исключение " асинхронная операция уже завершено ". Так что я так и не смог результат в dr.

Если вы столкнулись с проблемой, указанной в пункте №. 5, вы можете использовать следующее альтернативное решение, реализованное с использованием асинхронных делегатов, а не встроенных BeginExecuteReader () и EndExecuteReader (). В приведенном ниже решении элемент управления будет немедленно возвращен на следующую строку после вызова делегата, как это происходит в случае BeginExecuteReader ().

Альтернативное решение:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private delegate DataSet GetDSDelegate(string query);

    private void button1_Click(object sender, EventArgs e)
    {
        GetDSDelegate del = new GetDSDelegate(GetDataSetAsync);
        del.BeginInvoke(@"Select top 3 * from table1;", null, null);
    }

    private DataSet GetDataSetAsync(string query)
    {
        DataSet ds;
        using (SqlConnection conn = new SqlConnection(@"Data Source = mmmmm000011\sqlexpress; Initial Catalog = SOExamples; Integrated Security = SSPI; Asynchronous Processing = true;"))
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            try
            {
                conn.Open();
                SqlDataReader dr = cmd.ExecuteReader();

                DataTable dt = new DataTable();
                ds = new DataSet();

                dt.Load(dr);
                ds.Tables.Add(dt);
                dr.Close();
                Complete(ds);
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }
        }
        MessageBox.Show("Done!!!");
        return ds;
    }

    private void Complete(DataSet ds)
    {
        ...
    }
}
3
ответ дан 14 December 2019 в 13:44
поделиться

Я думаю, что соединение закрывается до того, как Reader сможет работать ...

using (SqlConnection conn = new SqlConnection(@"Data Source = bigapple; Initial Catalog = master; Integrated Security = SSPI; Asynchronous Processing = true;"))

Попробуйте изменить его на ...

SqlConnection conn = new SqlConnection(@"Data Source = bigapple; Initial Catalog = master; Integrated Security = SSPI; Asynchronous Processing = true;");
        conn.Open();
        SqlCommand cmd = new SqlCommand(@"WAITFOR DELAY '00:03'; Select top 3 * from sysobjects;", conn);
        IAsyncResult result = cmd.BeginExecuteReader(new AsyncCallback(HandleCallback), cmd, CommandBehavior.CloseConnection);

Кстати этот код ждет 3 минуты? Потому что пауза на 3 секунды не должна быть WAITFOR DELAY '0: 0: 3'?

3
ответ дан 14 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: