powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Неблокирующее исполнение метода.
14 сообщений из 14, страница 1 из 1
Неблокирующее исполнение метода.
    #40068020
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
private void ButtonGetIADevices_Click(object sender, EventArgs e)
{
    int count = 0;

    var t = Task.Run(() => count = IA3178.GetDevices());
    t.Wait();

    ComboBoxDevices.Items.Clear();

    for (int i = 0; i < count; i++)
    {
        ComboBoxDevices.Items.Add("DEVICE " + i.ToString());
    }
}


но всё равно GUI подмораживается. вроде как не должно?
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068022
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
Код: c#
1.
t.Wait();


В печь.
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068024
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
jenya7
Код: c#
1.
t.Wait();


В печь.

тогда список пустой. пока метод ищет девайсы код переходит к
Код: c#
1.
2.
3.
4.
5.
6.
ComboBoxDevices.Items.Clear();

for (int i = 0; i < count; i++)
{
    ComboBoxDevices.Items.Add("DEVICE " + i.ToString());
}


не дожидаясь окончания поиска.
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068029
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
тогда список пустой. пока метод ищет девайсы код переходит к
Код: c#
1.
2.
3.
4.
5.
6.
ComboBoxDevices.Items.Clear();

for (int i = 0; i < count; i++)
{
    ComboBoxDevices.Items.Add("DEVICE " + i.ToString());
}



не дожидаясь окончания поиска.

Так ты объясни понятно - чего ты добиться-то хочешь. А то хер поймешь, то ли тебе нужно чтобы он ждал, то ли тебе нужно наоборот. Мне сдается, что тебе надо вот это:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private async ButtonGetIADevices_Click(object sender, EventArgs e)
{
    int count = 0;
    ComboBoxDevices.Items.Clear();

    await Task.Run(() => count = IA3178.GetDevices());

    for (int i = 0; i < count; i++)
    {
        ComboBoxDevices.Items.Add("DEVICE " + i.ToString());
    }
}


Но это всего лишь моё предположение, потому что по твоему коду можно только гадать.
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068033
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
jenya7
тогда список пустой. пока метод ищет девайсы код переходит к
Код: c#
1.
2.
3.
4.
5.
6.
ComboBoxDevices.Items.Clear();

for (int i = 0; i < count; i++)
{
    ComboBoxDevices.Items.Add("DEVICE " + i.ToString());
}



не дожидаясь окончания поиска.

Так ты объясни понятно - чего ты добиться-то хочешь. А то хер поймешь, то ли тебе нужно чтобы он ждал, то ли тебе нужно наоборот. Мне сдается, что тебе надо вот это:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private async ButtonGetIADevices_Click(object sender, EventArgs e)
{
    int count = 0;
    ComboBoxDevices.Items.Clear();

    await Task.Run(() => count = IA3178.GetDevices());

    for (int i = 0; i < count; i++)
    {
        ComboBoxDevices.Items.Add("DEVICE " + i.ToString());
    }
}


Но это всего лишь моё предположение, потому что по твоему коду можно только гадать.

мне нужно - нажал на кнопку - подождал пока все девайсы найдены - показал их в комбобоксе. без замораживания формы.
Код: c#
1.
await Task.Run(() => count = IA3178.GetDevices());


это то что нужно. но
авторThe 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.


у меня
Код: 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.
 static public int GetDevices()
{
    IAError ia_err = ia_devs.DetectAllDevices();
    int idx = 0;
    int count;

    if (ia_err != IAError.IA_OK)
    {
          GlobalMessage = ia_devs.GetErrorMessage(ia_err);
          return 0;
    }

     if (ia_devs.Devices.Count == 0)
     {
         GlobalMessage = "No device found";
         return 0;
    }
    else
     {
            count = ia_devs.Devices.Count;

            ia_devices = new IADevice[count];

            foreach (IADevice dev in ia_devs)
            {
                  if (dev.HasDigitalInput || dev.HasDigitalOutput)
                   {
                        if (idx < count)
                            ia_devices[idx++] = dev;
                  }
            }

        DevicesCount = idx;

        return DevicesCount;
    }
}


если переделать в
Код: c#
1.
static public async Task<int> GetDevices()


то
авторThe 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.

Cannot implicitly convert type 'System.Threading.Tasks.Task<int>' to 'int'

This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068048
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

Не код, а адская говнолапша, которую забесплатно рефакторить нет никакого желания. Поэтому буду краток - все что тебе надо, это вместо

jenya7
Код: c#
1.
2.
3.
 static public int GetDevices()
{
    IAError ia_err = ia_devs.DetectAllDevices();


написать:

Код: c#
1.
2.
3.
 static public async Task<int> GetDevices()
{
    IAError ia_err = await Task.Run(() => ia_devs.DetectAllDevices());


Но, у тебя тут по любому такой ад (например, с теми же static), что тебе это в конечном результате все равно мало поможет.
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068053
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
jenya7,

Не код, а адская говнолапша, которую забесплатно рефакторить нет никакого желания. Поэтому буду краток - все что тебе надо, это вместо

jenya7
Код: c#
1.
2.
3.
 static public int GetDevices()
{
    IAError ia_err = ia_devs.DetectAllDevices();


написать:

Код: c#
1.
2.
3.
 static public async Task<int> GetDevices()
{
    IAError ia_err = await Task.Run(() => ia_devs.DetectAllDevices());


Но, у тебя тут по любому такой ад (например, с теми же static), что тебе это в конечном результате все равно мало поможет.


сделал. но всё равно на
Код: c#
1.
 await Task.Run(() => count = IA3178.GetDevices());


ругается
авторThe 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.

Cannot implicitly convert type 'System.Threading.Tasks.Task<int>' to 'int'


если включить автокорекцию то он предлагает изменить метод на
Код: c#
1.
private async Task ButtonGetIADevices_ClickAsync(object sender, EventArgs e)


но то гда ошибка в дизайнере
Код: c#
1.
2.
3.
this.ButtonGetIADevices.Click += new System.EventHandler(this.ButtonGetIADevices_ClickAsync);

'Task MainForm.ButtonGetIADevices_ClickAsync(object, EventArgs)' has the wrong return type	
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068059
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
но тогда ошибка в дизайнере

В голове твоей ошибка. Я пас. Читай учебники.
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068070
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
jenya7
но тогда ошибка в дизайнере

В голове твоей ошибка. Я пас. Читай учебники.


слабаки упали. :) а что скажут не мальчики но мужи?
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068079
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        private async void ButtonGetIADevices_Click(object sender, EventArgs e)
        {
            int count =  await Task.Run(() => IA3178.GetDevices());
            
            ComboBoxDevices.Items.Clear();

            for (int i = 0; i < count; i++)
            {
                ComboBoxDevices.Items.Add("DEVICE " + i.ToString());
            }
        }
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068082
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Cite
jenya7,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        private async void ButtonGetIADevices_Click(object sender, EventArgs e)
        {
            int count =  await Task.Run(() => GetDevices());
            
            ComboBoxDevices.Items.Clear();

            for (int i = 0; i < count; i++)
            {
                ComboBoxDevices.Items.Add("DEVICE " + i.ToString());
            }
        }



спасибо! вот это по-нашему, по-мужицки!
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068092
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы пользуйтесь технологиями, которые не понимаете.
лучше уж использовать obsolete типы, или потоки, чем заниматься такой вот дичью, не понимая до конца, как это работает
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068096
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes
вы пользуйтесь технологиями, которые не понимаете.
лучше уж использовать obsolete типы, или потоки, чем заниматься такой вот дичью, не понимая до конца, как это работает


ну почему не понимаю. асинхронный метод вызывает таск и ждёт его окончания. в шарпе синтаксис иногда бывает хитромудрённый без пол-литра не разберёшся.
...
Рейтинг: 0 / 0
Неблокирующее исполнение метода.
    #40068108
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
ну почему не понимаю. асинхронный метод вызывает таск и ждёт его окончания.

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


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