Чтобы указать ход выполнения действий, попробуйте следующие команды:
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 для проверки и отображения значения / степени прогресса.
Некоторые моменты, которые я заметил:
- Метод обратного вызова был вызван только после того, как я удалил WAITFOR DELAY stmt.
- Нет необходимости опрашивать result.IsCompleted, потому что Метод обратного вызова запускается только после асинхронная обработка завершена.
- Нет необходимости явно устанавливать dr = null в части else, потому что по умолчанию она будет равно null.
- Вы должны обработать InvalidOperationException и ArgumentException в HandleCallback метод.
- В обратном вызове дескриптора всякий раз, когда вызывается 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)
{
...
}
}
Я думаю, что соединение закрывается до того, как 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'?