|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
Добрый день! Помогите, пожалуйста, в следующем: как запустить процедуру асинхронно. У меня в коде идет проверка подключения к SQL серверу, сервера берутся из listbox. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace StatConSQL { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { foreach (object item in listBox1.Items) { con(item.ToString()); } } public void con(string serv) { String connString = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=master;Data Source="+serv+";Connect Timeout=3"; using (var conn = new SqlConnection(connString)) { try { conn.Open(); MessageBox.Show(serv+" conn.Open"); } catch (SqlException ex) { MessageBox.Show(ex.ToString() + conn.ConnectionString.ToString()); } } } } } ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 17:07 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
beaver06, backgroundworker ЗЫ это божественно! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 17:09 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
Pallaris, а можно набросок применимо к моему примеру? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 17:23 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
beaver06, сформулируй что ты хочешь. А то не ясно, какую процедуру тебе надо запустить асинхронно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 17:28 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
Pallaris, пробежаться по listbox и для каждого item выполнить con(item.ToString()). Результат выполнения вывести например в console. Дело в том, что для каждого sql сервера разное время ответа, некоторые могут вообще быть выключенными и тогда время отклика может достигать 30 секунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 17:31 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
beaver06, да у тебя messagebox вне зависимости от результата коннекта, какая тут может быть асинхронность? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 17:33 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
Pallarisbeaver06, backgroundworker ЗЫ это божественно! +1 Больше ничего и не надо тут. А мессадж бокс лучше выводить в конце с summary информацией. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 18:12 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
АбсолютБольше ничего и не надо тут. А мессадж бокс лучше выводить в конце с summary информацией. MessageBox в этом случае от лукавого. Запустил ты процесс, лазишь по своим делам по формочке и тут бах! - внезапно он. Наш вариант - заполнять какой-нибудь текстовый бокс инфой по мере выполнения проверок коннектов Server1 - Connected Server2 - Failed .... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 18:17 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
Backgroundworker? Нет, слишком громоздкий объект, такие вещи надо делать только на IAsyncResult используя WaitHandle, если хотите контролировать результат выполнения операции. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 18:34 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
Pallaris, да не будет у меня message box. У меня вообще будет служба, которая будет брать значения из таблицы sql, а рез-ты будут записываться в другую таблицу. Здесь у меня простой пример, чтобы отработать решение. Я просто не знаю как мою процедуру запускать ассинхронно. Хотелось бы простой пример как это сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2013, 09:04 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
// в строке соединения обязательно должны присутствовать: Код: plaintext
// передаем коллбек, состояние и закрываем открытый предварительно коннект после обработки коллбека (последнее не обязательно, смотрите перегруженные варианты) Код: c# 1.
// в коллбеке получаем команду, инициировавшую асинхронную опреацию, и завершаем чтение Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2013, 11:20 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
Вот что получилось, но одна проблема: идет чтение из таблицы имя сервера, проверяется подключение con(string serv). Но при этом проверка идет последовательно, т.е. проверяется один сервер, затем 2-й и т.д. А можно как-то сделать чтобы проверка по всем серверам была параллельна? public static void BeginDataBaseCall() { Console.WriteLine("BeginDataBaseCall()"); string connetionString = null; connetionString = "Asynchronous Processing=true;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Baza;Data Source=Server"; SqlConnection connection; connection = new SqlConnection(connetionString); SqlCommand command = new SqlCommand("Select servername from table", connection); connection.Open(); command.BeginExecuteReader(EndDatabaseCall, command); Console.ReadLine(); } public static void EndDatabaseCall(IAsyncResult result) { Console.WriteLine("EndDatabaseCall"); StringBuilder builder = new StringBuilder(); builder.Append("DbCall Results: "); SqlCommand command = result.AsyncState as SqlCommand; try { using (SqlDataReader reader = command.EndExecuteReader(result)) { while (reader.Read()) { con(reader[0].ToString()); } } } catch { throw; } finally { #region Cleanup command.Connection.Close(); command.Connection.Dispose(); command.Dispose(); #endregion } Console.WriteLine(builder.ToString()); } private static void con(string serv) { String connString = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=master;Data Source=" + serv + ";Connect Timeout=3"; using (var conn = new SqlConnection(connString)) { try { conn.Open(); string folderPath = @"c:\temp"; if (!System.IO.Directory.Exists(folderPath)) System.IO.Directory.CreateDirectory(folderPath); FileStream fs = new FileStream(folderPath + "\\WindowsService.txt", FileMode.OpenOrCreate, FileAccess.Write); StreamWriter m_streamWriter = new StreamWriter(fs); m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); m_streamWriter.WriteLine("conn.Open "+ serv); m_streamWriter.Flush(); m_streamWriter.Close(); conn.Close(); } catch (SqlException ex) { string folderPath = @"c:\temp"; if (!System.IO.Directory.Exists(folderPath)) System.IO.Directory.CreateDirectory(folderPath); FileStream fs = new FileStream(folderPath + "\\WindowsService.txt", FileMode.OpenOrCreate, FileAccess.Write); StreamWriter m_streamWriter = new StreamWriter(fs); m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); m_streamWriter.WriteLine(ex.ToString() + serv); m_streamWriter.Flush(); m_streamWriter.Close(); } } } ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2013, 12:25 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
beaver06А можно как-то сделать чтобы проверка по всем серверам была параллельна? А смысл? Что, перебираются сотни серверов? PS См. Task ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2013, 12:27 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
Arm79, да. Пока 25. В будущем около 2000 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2013, 12:29 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
У SqlCommand есть метод OpenAsync ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2013, 12:51 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
Arm79, но это только в .NET Framework 4.5? А с 4.0 как ? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2013, 12:56 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
beaver06но это только в .NET Framework 4.5? А с 4.0 как ? Запускать параллельные процессы по каждому Open() вручную, как еще. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2013, 13:15 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
PallarisArm79У SqlCommand есть метод OpenAsync Это у коннекшна, а не у команды Да, опечатался. По ссылке именно Connection привел. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2013, 14:12 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
Pallarisbeaver06но это только в .NET Framework 4.5? А с 4.0 как ? Запускать параллельные процессы по каждому Open() вручную, как еще.Чтобы всё легло с OutOfMemoryException? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2013, 14:24 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
Алексей КЧтобы всё легло с OutOfMemoryException? ThreadPool, можно PLINQ ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2013, 14:28 |
|
Ассинхронное выполение
|
|||
---|---|---|---|
#18+
Алексей КPallarisпропущено... Запускать параллельные процессы по каждому Open() вручную, как еще.Чтобы всё легло с OutOfMemoryException? Ну не бездумно, конечно же ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2013, 14:37 |
|
|
start [/forum/topic.php?fid=20&msg=38280607&tid=1404572]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 310ms |
total: | 472ms |
0 / 0 |