powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Firebird NET Provider и Async методы.
6 сообщений из 6, страница 1 из 1
Firebird NET Provider и Async методы.
    #39690770
Фотография gds
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго настроения.
Собственно проблема: Не получается запустить выполнение запроса асинхронно для Firebird NET Provider. Хотя тот же код с SQL Server выполняется асинхронно. Подскажите в чем может быть дело?
Visual Studio 2015 U3
Firebird .NET Provider 6.1.0.0

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
using System;
using System.Data;
using System.Data.SqlClient;
using System.Threading.Tasks;
using FirebirdSql.Data.FirebirdClient;
using System.Windows.Forms;

namespace Async_Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            bsInfo.DataSource = await GetFBList();
            //bsInfo.DataSource = await GetSQLList();
        }

        private async Task<DataTable> GetFBList()
        {
            var conn_str = new FbConnectionStringBuilder();
            conn_str.Database = "C:\\FDB\\FIRETEST.FDB";
            conn_str.UserID = "SYSDBA";
            conn_str.Password = "masterkey";
            conn_str.Dialect = 3;
            conn_str.Charset = "NONE";
            conn_str.DataSource = "localhost";
            DataTable dt = new DataTable();
            dt.Columns.AddRange(
                new[] {
                    new DataColumn("a",typeof(int)),
                    new DataColumn("b",typeof(int)),
                    new DataColumn("c",typeof(int)),
                    new DataColumn("d",typeof(int))
                }
                );
            using(var conn = new FbConnection(conn_str.ToString()))
            {
                var cmd = conn.CreateCommand();
                cmd.CommandText = "SELECT a.* FROM RDB$PAGES a CROSS JOIN RDB$PAGES b CROSS JOIN RDB$PAGES c";

                try
                {
                    await conn.OpenAsync();
                    using (var read = await cmd.ExecuteReaderAsync())
                    {
                        while (read.Read())
                        {
                            var row = dt.NewRow();
                            row["a"] = read[0];
                            row["b"] = read[1];
                            row["c"] = read[2];
                            row["d"] = read[3];
                            dt.Rows.Add(row);
                        }
                        read.Close();
                    }
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message, ex.Source);
                }
                finally
                {
                    if (conn?.State == ConnectionState.Open)
                        conn?.Close();
                }
            }
            return dt;
        }
        private async Task<DataTable> GetSQLList()
        {
            var conn_str = new SqlConnectionStringBuilder();
            conn_str.DataSource = ".";
            conn_str.InitialCatalog = "crm_bro";
            conn_str.IntegratedSecurity = true;

            DataTable dt = new DataTable();
            dt.Columns.AddRange(
                new[] {
                    new DataColumn("a",typeof(string)),
                    new DataColumn("b",typeof(int)),
                    new DataColumn("c",typeof(int)),
                    new DataColumn("d",typeof(int))
                }
                );
            using (var conn = new SqlConnection(conn_str.ToString()))
            {
                var cmd = conn.CreateCommand();
                cmd.CommandText = "[dbo].[get_delay_version]";
                cmd.CommandType = CommandType.StoredProcedure;
		// cmd.CommandText = "select 1 from master..spt_values a cross join master..spt_values b cross join master..spt_values c"
                try
                {
                    await conn.OpenAsync();
                    using (var read = await cmd.ExecuteReaderAsync())
                    {
                        while (read.Read())
                        {
                            var row = dt.NewRow();
                            row["a"] = read[0];
                            row["b"] = 1;
                            row["c"] = 2;
                            row["d"] = 3;
                            dt.Rows.Add(row);
                        }
                        read.Close();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, ex.Source);
                }
                finally
                {
                    if (conn?.State == ConnectionState.Open)
                        conn?.Close();
                }
            }
            return dt;
        }
    }
}


т.е. конечный результат. Надо что бы долго выполняющая процедура не блокировала пользовательский поток UI.
Можно конечно поиграться с отдельным потоком (собственно как сейчас и сделано) или завернуть всё в TaskCompletionSource. Но в друг кто-то знает как завести и использовать async/await из коробки?

В соседнем топике была создана, но перенесу и сюда
NET Provider и Async методы.
...
Рейтинг: 0 / 0
Firebird NET Provider и Async методы.
    #39690780
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала ConfigureAwait(false) во все ожидания, кроме первого
...
Рейтинг: 0 / 0
Firebird NET Provider и Async методы.
    #39690785
Фотография gds
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Не помогает. все равно блокирует UI.
...
Рейтинг: 0 / 0
Firebird NET Provider и Async методы.
    #39690789
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gds,
Уберите весь лишний код и вставьте одну строку с ридером connection.
Ну, или sleep() в хранимке.
Тестируйте.
...
Рейтинг: 0 / 0
Firebird NET Provider и Async методы.
    #39690882
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gdsНо в друг кто-то знает как завести и использовать async/await из коробки?

Возможно, в Firebird криво реализована асинхронность, надо смотреть исходники или профилировать.
...
Рейтинг: 0 / 0
Firebird NET Provider и Async методы.
    #39690905
Фотография gds
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttgdsНо в друг кто-то знает как завести и использовать async/await из коробки?

Возможно, в Firebird криво реализована асинхронность, надо смотреть исходники или профилировать.

Похоже на это. Сейчас обернул Begin и End методы через TaskFactory.FromAsync и взлетело.

Всем спасибо.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Firebird NET Provider и Async методы.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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