Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
116 / 117 / 52
Регистрация: 19.12.2014
Сообщений: 612
1

Асинхронный вызов метода - форма все равно подвисает

09.05.2015, 17:35. Показов 4094. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть метод, в котором заполняется richtextbox, пытаюсь вызвать его асинхронно с помощью делегатов, но что то не выходит, вот код.
Ошибок никаких не выдает, но при выполнении все равно форма подвисает, пока метод не закончит свою работу
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public delegate void Deleg();
        public Deleg myDelegate;
 
        public void async()
        {
            
            for (int i = 0; i < 100; i++)
            {
                richTextBox1.AppendText(i.ToString() + "\n");
                Thread.Sleep(100);
            }
        }
 
         private void button2_Click(obj sender, EventArgs  e)
        {
            myDelegate = async;
            IAsyncResult asyncRes = richTextBox1.BeginInvoke(myDelegate);
            richTextBox1.EndInvoke(asyncRes);
            
        }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2015, 17:35
Ответы с готовыми решениями:

Асинхронный вызов метода с параметрами
Здравствуйте, возможно ли в c++ вызвать метод с параметрами и не дожидаясь его завершения...

Обновление окна по таймеру: форма все равно зависает
Всем привет! Делаю вот так void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)...

Форма если не проходит проверку, все равно отправляет запрос
Всем привет! Помогите подправить код. При клике на кнопку должна проходить валидация и если...

Форма регистрации и логина по видео урокам - все равно не работает
Братва помогите по форме логина , не могу найти ошибку выходить это Fatal error: Can't use...

11
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
09.05.2015, 18:40 2
Лучший ответ Сообщение было отмечено lokilo как решение

Решение

Цитата Сообщение от lokilo Посмотреть сообщение
все равно форма подвисает, пока метод не закончит свою работу
Судя по вашему коду, это вполне естественно и ожидаемо.
А почему с делегатами, а не другие конструкции? Ради интереса, я так понимаю?

Добавлено через 7 минут
Вот рабочий пример. И да, объект типа IAsyncResult вам тут не нужен, поскольку метод ничего не возвращает (хотя кто как советует, кто-то говорит, что EndInvoke() лучше вызывать, а кто нет).
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
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.Threading;
 
namespace WindowsFormsApplication3 {
    public partial class Form1 : Form {
        delegate void MyDelegate();
        public Form1() {
            InitializeComponent();
            button1.Click += new EventHandler(button1_Click);
        }
 
        void button1_Click(object sender, EventArgs e) {
            MyDelegate del = new MyDelegate(FillRTB);
            del.BeginInvoke(null, null);
        }
        void FillRTB() {
            for (int i = 0; i < 10; i++) {
                richTextBox1.Invoke((Action)(() => { richTextBox1.AppendText(string.Format("{0}\n", i)); }));
                Thread.Sleep(500);
            }
        }
    }
}
2
116 / 117 / 52
Регистрация: 19.12.2014
Сообщений: 612
09.05.2015, 19:18  [ТС] 3
Цитата Сообщение от insite2012 Посмотреть сообщение
А почему с делегатами, а не другие конструкции?
Ну просто у меня VS 2010, а так понимаю введение аsync начинается с VS 2012?
Просто нашел через делегаты, ну и так же все примеры даны для консоли, а для winform так и не нашел нужных объяснений. Да и вроде бы еще ничего не встретил, если скажите еще какие то конструкции, то почитаю про них.

Добавлено через 6 минут
insite2012,
C#
1
richTextBox1.Invoke((Action)(() => { richTextBox1.AppendText(string.Format("{0}\n", i)); }));
Почему, то были предположения, что загвоздка где то здесь, что чего то не дописал
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
09.05.2015, 19:23 4
Цитата Сообщение от lokilo Посмотреть сообщение
так понимаю введение аsync начинается с VS 2012?
А зачем вам async? Я сам этими конструкциями не пользуюсь, поскольку работаю в 2010 Студии, но есть же классы Thread и Task.

Добавлено через 54 секунды
Цитата Сообщение от lokilo Посмотреть сообщение
были предположения, что загвоздка где то здесь, что чего то не дописал
Нет, это немного не то. Вы вообще всю конструкцию неверно построили. А это - просто маршалинг из пула потоков в поток UI.
0
116 / 117 / 52
Регистрация: 19.12.2014
Сообщений: 612
09.05.2015, 19:32  [ТС] 5
insite2012, поверьте я не сразу сюда код выложил, а как только не переставлял, но потом подумал, раз такой код где то уже видел, то значит так и должно быть. А до использования лямбда выражений не дошло почему то
Цитата Сообщение от insite2012 Посмотреть сообщение
но есть же классы Thread и Task.
Thread использовал, я так понимаю только синхронно, да и то это еще только на примерах для себя, что так сказать изучить по больше и применять после так где это нужно и так сказать не обходиться без них, а заочно знать, как и где и что написать.
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
09.05.2015, 19:34 6
Цитата Сообщение от lokilo Посмотреть сообщение
я не сразу сюда код выложил, а как только не переставлял
Это типа методом научного тыка?)))
Возьмите книгу Троелсена, раздел по потокам. Там это все подробно расписано. Использование делегатов (для асинхронного вызова) и все остальное.
Цитата Сообщение от lokilo Посмотреть сообщение
Thread использовал, я так понимаю только синхронно
Это как? Покажите пример как использовали))
0
116 / 117 / 52
Регистрация: 19.12.2014
Сообщений: 612
09.05.2015, 19:42  [ТС] 7
insite2012,
Цитата Сообщение от insite2012 Посмотреть сообщение
Это типа методом научного тыка?
Совершенно верно, просто то там что то подсмотришь, то тут, там подставишь это, сюда переставишь
Ну вот как делал с помощью Thread но опять же это в консоле, и да ошибся, на тот момент когда я это делал, не думал о вещах синхронность и асинхронность, я сейчас подвигал окно консоли, а оно не зависает)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void Main(string[] args)
        {
            Thread myThread = new Thread(func); 
 
            myThread.Start();
 
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("Поток 1 выводит " + i);
                Thread.Sleep(100);
            }
 
            Console.Read();
 
        }
        static void func()
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("Поток 2 выводит " + i.ToString());
                Thread.Sleep(120);
            }
        }
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
09.05.2015, 19:44 8
Цитата Сообщение от lokilo Посмотреть сообщение
то там что то подсмотришь, то тут, там подставишь это, сюда переставишь
Это плохо. Нужно четкое понимание примитивов, тогда вы сможете не только использовать чьи-то куски, но и делать свои конструкции.
0
116 / 117 / 52
Регистрация: 19.12.2014
Сообщений: 612
09.05.2015, 19:48  [ТС] 9
insite2012, хорошо, буду стараться так и делать

Добавлено через 1 минуту
insite2012, вот не отходя от темы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void async()
        {
            
            for (int i = 0; i < 100; i++)
            {
                richTextBox1.Invoke((Action)(() => { richTextBox1.AppendText(string.Format("{0}\n", i)); }));
                Thread.Sleep(100);
            }
        }
 
         private void button2_Click(obj sender, EventArgs  e)
        {
            Thread myThread = new Thread(async);
            myThread.Start();
             
            
        }
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
09.05.2015, 19:50 10
Цитата Сообщение от lokilo Посмотреть сообщение
вот не отходя от темы
Ну да, все верно, так будет работать аналогично коду с делегатом.
0
116 / 117 / 52
Регистрация: 19.12.2014
Сообщений: 612
09.05.2015, 19:56  [ТС] 11
insite2012,
C#
1
richTextBox1.Invoke((Action)(() => { richTextBox1.AppendText(string.Format("{0}\n", i));
А здесь применяются только лямбда выражения, или еще как то возможно?

И да конечно же нужно будет правильно завершить поток. Вот так правильно будет?
C#
1
myThread.Abort();
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
09.05.2015, 19:57 12
Цитата Сообщение от lokilo Посмотреть сообщение
только лямбда выражения, или еще как то возможно?
Да конечно возможно, только кода будет больше, только и всего. Можно вообще отдельный метод сделать))
Почитайте ту книгу что я вам посоветовал, там это все рассматривается.
0
09.05.2015, 19:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2015, 19:57
Помогаю со студенческими работами здесь

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что...

Если форма вдруг закрылась то поток все равно долбится к ликвидированному объекту
readThreed = new Thread(new ThreadStart(RunClient)); readThreed.Start(); } ...

Асинхронный вызов
Люди, кроме BeginInvoke EndInvoke как еще можно сделать асинхронный вызов? препод сказал, что это...

Асинхронный вызов функции
с потоками еще не имел дело как и с асинхронностью, поэтому пишу сюда. у меня есть 2 функции,...

Асинхронный вызов httpWebResponse
Мне нужно вернуть строку, в класс вызвавший функцию, которая получена методом GetYoulaAdvert...

Правильный асинхронный вызов
Здравствуйте. Есть json файл, который нужно асинхронно парсить при вызове первого Activity. Я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru