Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ассинхронное выполение / 25 сообщений из 26, страница 1 из 2
30.05.2013, 17:07
    #38280552
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Добрый день!
Помогите, пожалуйста, в следующем: как запустить процедуру асинхронно. У меня в коде идет проверка подключения к 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());
}
}
}
}
}
...
Рейтинг: 0 / 0
30.05.2013, 17:09
    #38280560
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
beaver06,

backgroundworker

ЗЫ это божественно!
...
Рейтинг: 0 / 0
30.05.2013, 17:23
    #38280589
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Pallaris,

а можно набросок применимо к моему примеру?
...
Рейтинг: 0 / 0
30.05.2013, 17:28
    #38280603
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
beaver06,

сформулируй что ты хочешь. А то не ясно, какую процедуру тебе надо запустить асинхронно.
...
Рейтинг: 0 / 0
30.05.2013, 17:31
    #38280607
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Pallaris,

пробежаться по listbox и для каждого item выполнить con(item.ToString()).
Результат выполнения вывести например в console. Дело в том, что для каждого sql сервера разное время ответа, некоторые могут вообще быть выключенными и тогда время отклика может достигать 30 секунд.
...
Рейтинг: 0 / 0
30.05.2013, 17:33
    #38280612
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
beaver06,

да у тебя messagebox вне зависимости от результата коннекта, какая тут может быть асинхронность?
...
Рейтинг: 0 / 0
30.05.2013, 18:12
    #38280671
Абсолют
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Pallarisbeaver06,

backgroundworker

ЗЫ это божественно!

+1

Больше ничего и не надо тут. А мессадж бокс лучше выводить в конце с summary информацией.
...
Рейтинг: 0 / 0
30.05.2013, 18:17
    #38280677
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
АбсолютБольше ничего и не надо тут. А мессадж бокс лучше выводить в конце с summary информацией.

MessageBox в этом случае от лукавого. Запустил ты процесс, лазишь по своим делам по формочке и тут бах! - внезапно он.
Наш вариант - заполнять какой-нибудь текстовый бокс инфой по мере выполнения проверок коннектов
Server1 - Connected
Server2 - Failed
....
...
Рейтинг: 0 / 0
30.05.2013, 18:34
    #38280702
skole
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Backgroundworker? Нет, слишком громоздкий объект, такие вещи надо делать только на IAsyncResult используя WaitHandle, если хотите контролировать результат выполнения операции.
...
Рейтинг: 0 / 0
31.05.2013, 09:04
    #38281082
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Pallaris,

да не будет у меня message box. У меня вообще будет служба, которая будет брать значения из таблицы sql, а рез-ты будут записываться в другую таблицу. Здесь у меня простой пример, чтобы отработать решение.

Я просто не знаю как мою процедуру запускать ассинхронно. Хотелось бы простой пример как это сделать.
...
Рейтинг: 0 / 0
31.05.2013, 10:37
    #38281187
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
...
Рейтинг: 0 / 0
31.05.2013, 11:20
    #38281257
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
// в строке соединения обязательно должны присутствовать:
Код: plaintext
Integrated Security=False;Persist Security Info=False;User ID=user;Password=password;Initial Catalog=catalog;Data Source=server;Asynchronous Processing=True

// передаем коллбек, состояние и закрываем открытый предварительно коннект после обработки коллбека (последнее не обязательно, смотрите перегруженные варианты)
Код: c#
1.
BeginExecuteReader(new AsyncCallback(EndExecuteReader), _reader, CommandBehavior.CloseConnection);



// в коллбеке получаем команду, инициировавшую асинхронную опреацию, и завершаем чтение
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private void EndExecuteReader(IAsyncResult ar)
{
	SqlCommand _cmd = (SqlCommand) ar.AsyncState;

	using (var _dataReader = _cmd.EndExecuteReader(ar))
	{
		while (_dataReader.Read())
		{
			...
		}
	}
}
...
Рейтинг: 0 / 0
31.05.2013, 12:09
    #38281360
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
...
Рейтинг: 0 / 0
03.06.2013, 12:25
    #38283472
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Вот что получилось, но одна проблема: идет чтение из таблицы имя сервера, проверяется подключение 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();
}
}
}
...
Рейтинг: 0 / 0
03.06.2013, 12:27
    #38283479
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
beaver06А можно как-то сделать чтобы проверка по всем серверам была параллельна?

А смысл? Что, перебираются сотни серверов?


PS См. Task
...
Рейтинг: 0 / 0
03.06.2013, 12:29
    #38283483
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Arm79,

да. Пока 25. В будущем около 2000
...
Рейтинг: 0 / 0
03.06.2013, 12:51
    #38283537
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
У SqlCommand есть метод OpenAsync
...
Рейтинг: 0 / 0
03.06.2013, 12:56
    #38283556
beaver06
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Arm79,

но это только в .NET Framework 4.5? А с 4.0 как ?
...
Рейтинг: 0 / 0
03.06.2013, 13:12
    #38283594
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Arm79У SqlCommand есть метод OpenAsync

Это у коннекшна, а не у команды
...
Рейтинг: 0 / 0
03.06.2013, 13:15
    #38283602
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
beaver06но это только в .NET Framework 4.5? А с 4.0 как ?

Запускать параллельные процессы по каждому Open() вручную, как еще.
...
Рейтинг: 0 / 0
03.06.2013, 14:12
    #38283750
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
PallarisArm79У SqlCommand есть метод OpenAsync

Это у коннекшна, а не у команды

Да, опечатался. По ссылке именно Connection привел.
...
Рейтинг: 0 / 0
03.06.2013, 14:24
    #38283766
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Pallarisbeaver06но это только в .NET Framework 4.5? А с 4.0 как ?

Запускать параллельные процессы по каждому Open() вручную, как еще.Чтобы всё легло с OutOfMemoryException?
...
Рейтинг: 0 / 0
03.06.2013, 14:28
    #38283770
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Алексей КЧтобы всё легло с OutOfMemoryException?

ThreadPool, можно PLINQ
...
Рейтинг: 0 / 0
03.06.2013, 14:37
    #38283784
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
Алексей КPallarisпропущено...


Запускать параллельные процессы по каждому Open() вручную, как еще.Чтобы всё легло с OutOfMemoryException?

Ну не бездумно, конечно же
...
Рейтинг: 0 / 0
04.06.2013, 01:34
    #38284554
skole
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ассинхронное выполение
beaver06 А можно как-то сделать чтобы проверка по всем серверам была параллельна?Тебе SeVa уже дал нормальную ссылку, юзай ее, лучше пока ты не напишешь.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ассинхронное выполение / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]