Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Неблокирующее исполнение метода.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Делаю так
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 подмораживается. вроде как не должно?

Сообщение было отредактировано: 3 май 21, 08:26
3 май 21, 08:34    [22317712]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
fkthat
Member

Откуда:
Сообщений: 4880
jenya7
t.Wait();

В печь.
3 май 21, 08:47    [22317714]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
fkthat
jenya7
t.Wait();

В печь.

тогда список пустой. пока метод ищет девайсы код переходит к
ComboBoxDevices.Items.Clear();

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

не дожидаясь окончания поиска.
3 май 21, 08:58    [22317716]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
fkthat
Member

Откуда:
Сообщений: 4880
jenya7
тогда список пустой. пока метод ищет девайсы код переходит к
ComboBoxDevices.Items.Clear();

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


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

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

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());
    }
}

Но это всего лишь моё предположение, потому что по твоему коду можно только гадать.
3 май 21, 11:03    [22317723]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
fkthat
jenya7
тогда список пустой. пока метод ищет девайсы код переходит к
ComboBoxDevices.Items.Clear();

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


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

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

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());
    }
}

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

мне нужно - нажал на кнопку - подождал пока все девайсы найдены - показал их в комбобоксе. без замораживания формы.
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'.


у меня
 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;
    }
}

если переделать в
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.
3 май 21, 11:29    [22317731]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
fkthat
Member

Откуда:
Сообщений: 4880
jenya7,

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

jenya7
 static public int GetDevices()
{
    IAError ia_err = ia_devs.DetectAllDevices();

написать:

 static public async Task<int> GetDevices()
{
    IAError ia_err = await Task.Run(() => ia_devs.DetectAllDevices());

Но, у тебя тут по любому такой ад (например, с теми же static), что тебе это в конечном результате все равно мало поможет.
3 май 21, 13:06    [22317757]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
fkthat
jenya7,

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

jenya7
 static public int GetDevices()
{
    IAError ia_err = ia_devs.DetectAllDevices();

написать:

 static public async Task<int> GetDevices()
{
    IAError ia_err = await Task.Run(() => ia_devs.DetectAllDevices());

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


сделал. но всё равно на
 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'


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

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

'Task MainForm.ButtonGetIADevices_ClickAsync(object, EventArgs)' has the wrong return type	


Сообщение было отредактировано: 3 май 21, 13:12
3 май 21, 13:15    [22317763]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
fkthat
Member

Откуда:
Сообщений: 4880
jenya7
но тогда ошибка в дизайнере

В голове твоей ошибка. Я пас. Читай учебники.
3 май 21, 13:24    [22317769]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
fkthat
jenya7
но тогда ошибка в дизайнере

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


слабаки упали. :) а что скажут не мальчики но мужи?
3 май 21, 13:45    [22317783]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1834
jenya7,

        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());
            }
        }


Сообщение было отредактировано: 3 май 21, 14:09
3 май 21, 14:10    [22317796]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
X-Cite
jenya7,

        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());
            }
        }


спасибо! вот это по-нашему, по-мужицки!
3 май 21, 14:16    [22317803]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4206
вы пользуйтесь технологиями, которые не понимаете.
лучше уж использовать obsolete типы, или потоки, чем заниматься такой вот дичью, не понимая до конца, как это работает
3 май 21, 14:42    [22317821]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Roman Mejtes
вы пользуйтесь технологиями, которые не понимаете.
лучше уж использовать obsolete типы, или потоки, чем заниматься такой вот дичью, не понимая до конца, как это работает


ну почему не понимаю. асинхронный метод вызывает таск и ждёт его окончания. в шарпе синтаксис иногда бывает хитромудрённый без пол-литра не разберёшся.
3 май 21, 14:46    [22317825]     Ответить | Цитировать Сообщить модератору
 Re: Неблокирующее исполнение метода.  [new]
fkthat
Member

Откуда:
Сообщений: 4880
jenya7
ну почему не понимаю. асинхронный метод вызывает таск и ждёт его окончания.

Да, все так и есть.
3 май 21, 15:23    [22317848]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить