Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 13

Считывать файл в отдельном потоке

13.07.2013, 11:55. Показов 1432. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Подскажите пожалуйста, как сделать так, чтобы во время считывания csv-файла(вот здесь: dtable=Read_file_to_datatable(FilePath); ) форма не подвисала. Пробовал как-то запихать сие в отдельный поток, но не помогло. Скорее всего, запихивал коряво).
имеем такой код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 private void create_new_page(string FilePath)
        {
            TabPage myTabPage = new TabPage(getfoldername(FilePath));
            tabControl1.TabPages.Add(myTabPage);
            DataGridView dgv = new DataGridView();
            myTabPage.Controls.Add(dgv);
            DataTable dtable = new DataTable();
            dtable = Read_file_to_datatable(FilePath);            
            dgv.DataSource = dtable; 
            tabControl1.SelectedIndex = tabControl1.TabCount - 1;
        }
 private DataTable Read_file_to_datatable(string filepath)
     {
     ...
     }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.07.2013, 11:55
Ответы с готовыми решениями:

Класс в отдельном потоке
Всем доброго дня и хорошего настроения! :) Подскажите, у меня есть класс Calculate как его запустить в отдельном потоке при нажатии на...

Авторизация в отдельном потоке
Доброго времени суток. Авторизируюсь Вк через VKNET: CancellationTokenSource mToken = new CancellationTokenSource(); var...

Пикчербокс в отдельном потоке
Добрый день! Подскажите, кто знает, как добавить picturebox в отдельный поток (там будет анимация) желательно код. Заранее спасибо!

8
 Аватар для Tsin
1180 / 488 / 188
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
13.07.2013, 14:06
pu4oktepla, посмотрите в сторону Backgroundworker
0
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 13
13.07.2013, 15:23  [ТС]
Tsin, смотрел я туда) но хотелось бы копнуть поглубже, а не плодить эти несчастные бэкграундворкеры). да и к тому же там куча ограничений у этих воркеров. типа передавать только 1 параметр типа object и тд. а вот как самому создать поток, не блочащий форму)
0
 Аватар для Tsin
1180 / 488 / 188
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
13.07.2013, 15:56
pu4oktepla, можно попробовать через диспатчер)

C#
1
2
3
4
dtable.Dispatcher.BeginInvoke(new Action(delegate()
    {
        dtable=Read_file_to_datatable(FilePath);
    }));
не знаю, прокатит ли в этом случае..
0
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 13
13.07.2013, 17:13  [ТС]
Tsin, применить сие описанным вами способом не получается. Я канеш сейчас поизучаю справку по диспатчеру, но буду благодарен, если дадите пояснения по нему тоже)
0
 Аватар для Tsin
1180 / 488 / 188
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
13.07.2013, 18:30
pu4oktepla, я сам с ним плохо знаком пока что. Меня он выручал, когда надо было из другого потока(то есть из backgroundworker-а) обращаться к элементам формы для того, чтобы они выполняли какие-то действия с собой. Быть может стоит скомбинировать Thread и Dispatcher ?

З.Ы. Больше советов давать не буду, потому что боюсь только запутать. Интересно будет услышать решение этой проблемы)
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
13.07.2013, 19:07
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Можно вот так сделать.

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
    static class Program
    {
        [STAThread]
        static void Main()
        {
            //создаем поток
            Thread AsyncThread = new Thread(ThreadMethod);
            //запускаем его на исполнение
            AsyncThread.Start(new ThreadArg(Variable, CallBack));
        }
 
        int Variable = 10;
 
        static void CallBack(int result) //метод в котором получаем результат исполнения
        {
            Variable = result;
            MessageBox.Show(Variable.ToString());
        }
 
        static void ThreadMethod(object arg) //метод который выполняет нужную задачу
        {
            ThreadArg arguments = arg as ThreadArg;
 
            if (arguments == null) return;
 
            arguments.Value += 20;
 
            //по окончанию метода вызываем метод, в котором должны принять результат выполнения
            //нужно это для того, что бы можно было выделить асинхронную операцию в другой класс
            arguments.CallBack(arguments.Value);
        }
 
        class ThreadArg//класс для передачи всех параметров через один object
        {
            public ThreadArg(int Value, Action<int> CallBack)
            {
                this.Value = Value;
                this.CallBack = CallBack;
            }
 
            public int Value { get; set; }
            public Action<int> CallBack { get; set; }
        }
Если позволяют возможности, можно использовать net 4.5 там удобные фичи ввели async/await. Если нужно будет - покажу.
0
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 13
15.07.2013, 19:33  [ТС]
Цитата Сообщение от Anklav Посмотреть сообщение
Можно вот так сделать.


Если позволяют возможности, можно использовать net 4.5 там удобные фичи ввели async/await. Если нужно будет - покажу.
спасибо) канеш покажите) если несложно)
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
15.07.2013, 19:59
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Описание класса:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    class ClassWithAsyncMethodNet45
    {
        public int SyncSum(int One, int Two) //Синхронный метод
        {
            Thread.Sleep(2000);
 
            return One + Two;
        }
 
        public Task<int> AsyncSum(int One, int Two) //Тот же метод, но с возможность выполнятся асинхронно
        {
            return Task<int>.Factory.StartNew(new Func<int>(() => SyncSum(One, Two)));
        }
    }
Использование (допустим при клике на кнопку):
C#
1
2
3
4
5
6
7
        private async /*<-Пометили метод как асинхронный*/ void button1_Click(object sender, EventArgs e)
        {
            ClassWithAsyncMethodNet45 sm = new ClassWithAsyncMethodNet45();
            MessageBox.Show("Начало вычисления");
            int result = await /* <-дожидаемся выполнения результата*/ sm.AsyncSum(2, 2);
            MessageBox.Show("Вычисление завершено");
        }
Это все можно сделать и без async/await но при использовании нужно будет больше делать (создавать дополнительный метод. и т.д.)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.07.2013, 19:59
Помогаю со студенческими работами здесь

Форма в отдельном потоке
Я создал форму, которая будет отображаться во время загрузки приложения (в ней меняется прозрачность (она тоже что-то делает:))): она...

Заполнение TreeView в отдельном потоке
Добрый день. Понадобилось мне воспользоваться компонентом TreeView и сформировать в нём дерево, соответствующее файловой системы...

Создание контролов в отдельном потоке
Привет! В общем написал игру, работа которой основана на UserControl'ах. К каждому контролу прилагается кучка изображений, которые тут же...

Обработка CheckBox в отдельном потоке
Всем привет, подскажите пожалуйста, у меня есть n-ое количество checkbox-ов как мне обработать их свойства checked в отдельном потоке?...

Выполнение метода в отдельном потоке
Добрый %s! Возникла проблема следующего характера: Необходимо выполнять метод в отдельном потоке, дабы форма не тормозила. Метод...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru