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

Откуда:
Сообщений: 92
Подскажите, как продолжить выполнения кода после завершения потока BackgroundWorker:

  private void button1_Click(object sender, EventArgs e)
        {
            
            bw = new BackgroundWorker();
            bw.DoWork += (obj, ea) => TasksAsync(1);
            bw.RunWorkerAsync();
            //здесь подождать пока не выполнится поток
/////продолжить выполнение кода, ниже код
        }
12 май 18, 21:00    [21405534]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35315
OlegEgorov11,
вам советовали Async\Await и свежие технологии по потокам.
Игнорируете?
12 май 18, 21:33    [21405594]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
Petro123,
не могу в них разобраться, а это работает
12 май 18, 21:57    [21405632]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19446
М-да, отличный аргумент.
При этом с BackgroundWorker вы тоже не можете разобраться.
Какой смысл грызть кактус?
12 май 18, 22:06    [21405646]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35315
OlegEgorov11
не могу в них разобраться

ничего сложного. Ты не пытался

private Task MyAsync()
{
	return Task.Run(() =>
		{
			// код в потоке
			...
		}
		);
}

ButtonsClick()
{
	await MyAsync();
}
12 май 18, 22:08    [21405653]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
Shocker.Pro,
там я уже разобрался, просто через this.Invoke((Action)delegate передаю значения прогресс бару.
12 май 18, 22:14    [21405673]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
Petro123
OlegEgorov11
не могу в них разобраться

ничего сложного. Ты не пытался

private Task MyAsync()
{
	return Task.Run(() =>
		{
			// код в потоке
			...
		}
		);
}

ButtonsClick()
{
	await MyAsync();
}


В private Task MyAsync() я объявляю код, а по нажатию кнопки пишу:

 private void button1_Click(object sender, EventArgs e)
        {
            MyAsync();
            await MyAsync();
        }

Или где нужно объявлять этот await?
12 май 18, 22:15    [21405675]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
Shocker.Pro, мне не понятно что делать с await. Как-бы с BackgroundWorker у меня все работает все как нужно, ну чтобы форма не висла и прогресс бары заполнялись, но студия мне пишет, что не плохо бы было ввести await, я не могу понять как его использовать.
12 май 18, 22:18    [21405684]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
hVostt
Member

Откуда:
Сообщений: 14920
OlegEgorov11
Shocker.Pro, мне не понятно что делать с await. Как-бы с BackgroundWorker у меня все работает все как нужно, ну чтобы форма не висла и прогресс бары заполнялись, но студия мне пишет, что не плохо бы было ввести await, я не могу понять как его использовать.


Продолжайте использовать BackgroundWorker.
12 май 18, 22:22    [21405691]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
OlegEgorov11, я понял свою ошибку, и сделал так:
       private ASYNC void button1_Click(object sender, EventArgs e)
        {
            progressBar1.Style = ProgressBarStyle.Marquee;
            progressBar1.MarqueeAnimationSpeed = 30;
            MyAsync();
            await MyAsync();
            progressBar1.Style = ProgressBarStyle.Continuous;
            progressBar1.MarqueeAnimationSpeed = 0;
        }
    }
}

я не добавил ключевое слово async кнопке, теперь работает как я и хотел, но он выполняется два раза, почему?
12 май 18, 22:23    [21405695]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35315
OlegEgorov11
В private Task MyAsync() я объявляю код,

код писать в месте где мой комментарий // код в потоке
12 май 18, 22:24    [21405697]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
hVostt,
почему? я же хочу научиться
12 май 18, 22:24    [21405698]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35315
OlegEgorov11
а по нажатию кнопки пишу:

 private void button1_Click(object sender, EventArgs e)
        {
            MyAsync();
            await MyAsync();
        }

нет. Как у меня выше.

OlegEgorov11
Или где нужно объявлять этот await?

я вам уже всё написал. Только вставить код где мой коммент и повесить на стену в рамочку))
12 май 18, 22:26    [21405701]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35315
OlegEgorov11
но он выполняется два раза, почему?

в ButtonClick()
должна быть только одна строка:
await MyAsync();
больше ничего.
12 май 18, 22:28    [21405706]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
Petro123, но это же так не работает...
пишет 2 ошибки, 1 на ButtonsClick() - метод должен иметь тип возвращаемого значения, 2 - на await, что он должен использоваться только с Async
12 май 18, 22:29    [21405711]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
OlegEgorov11, Большое спасибо, так работает:

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

        private void progress()
        {
            progressBar1.Style = ProgressBarStyle.Continuous;
            progressBar1.MarqueeAnimationSpeed = 0;
        }
   private Task MyAsync()
{
	return Task.Run(() =>
		{
			  ProcessStartInfo psi;
                psi = new ProcessStartInfo("cmd", @"/c echo hello word" + "&" + "pause");
                Process.Start(psi).WaitForExit();
		});
		
}
               
        private async void button1_Click(object sender, EventArgs e)
        {
            progressBar1.Style = ProgressBarStyle.Marquee;
            progressBar1.MarqueeAnimationSpeed = 30;
          await MyAsync();
            progressBar1.Style = ProgressBarStyle.Continuous;
            progressBar1.MarqueeAnimationSpeed = 0;
        }
    }
}
12 май 18, 22:31    [21405712]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
hVostt
Member

Откуда:
Сообщений: 14920
OlegEgorov11
hVostt,
почему? я же хочу научиться


чему научиться? async/await имеет смысл использовать для асинхронных IO операций, запись/чтение файлов, обращения к БД (в том случае, если провайдер баз данных поддерживает асинхронный АПИ, например, провайдеры оракла не умеют).

если заворачиваете что-то в async/await, значит ВСЁ внутри должно следовать этому паттерну. поэтому сегодня многие современные программы пишут в стиле async-first.

поэтому давайте определяться. чему вы хотите научиться, и какой результат получить?

от BackgroundWorker-а отказываться не стоит, он прекрасно решает свою задачу.
12 май 18, 22:32    [21405713]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
hVostt
Member

Откуда:
Сообщений: 14920
Petro123
в ButtonClick()
должна быть только одна строка:
await MyAsync();
больше ничего.


такие советы как мёртвому припарка. человеку надо идти и доку курить, читать книжки, а не вставить await без малейшего понимания что он сделал. в формате форума этому не научить.
12 май 18, 22:33    [21405715]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
hVostt
Member

Откуда:
Сообщений: 14920
OlegEgorov11
return Task.Run(() =>
		{
			  ProcessStartInfo psi;
                psi = new ProcessStartInfo("cmd", @"/c echo hello word" + "&" + "pause");
                Process.Start(psi).WaitForExit();
		});


вот зачем человека фигне научили?
12 май 18, 22:33    [21405718]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35315
OlegEgorov11
на await, что он должен использоваться только с Async

да
private async void MyRun()
{
	await MyAsync();
}

private Task MyAsync()
{
	return Task.Run(() =>
		{
			// код в потоке
			...
		}
		);
}

ButtonsClick()
{
	MyRun();
}
12 май 18, 22:35    [21405727]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
hVostt, вообще у меня почти готовая программа, которая по нажатию кнопки создает в sql таблицы, наполняет их и выгружает в файл. У меня проблема была с зависанием формы, мне необходимо было сделать чтобы прогресс бар один бегал, второй заполнялся по значениям которые я ему присваиваю. Вот тот который бегает, не бегал, так как форма зависала. Вы говорите, что с BackgroundWorker в принципе можно решить эту проблему?
12 май 18, 22:37    [21405731]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35315
hVostt
вот зачем человека фигне научили?

это hello world за 3 минуты и просто для понимания.
Что и сделал MS супротив Java своим await.
..
Если получится в три минуты и просто рассказать почему фигня, то велкам.
Думаю, не получится.
12 май 18, 22:40    [21405742]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35315
hVostt
async/await имеет смысл использовать для асинхронных IO операций, запись/чтение файлов, обращения к БД (в том случае, если провайдер баз данных поддерживает асинхронный АПИ, например, провайдеры оракла не умеют).

у меня работает и не в том случае. Когда нет поддержки никем ниже. Это обычный поток.
12 май 18, 22:44    [21405752]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 2985
Мне кажется, что неверно заставлять человека сразу разбираться в async\await, тем более, что это по сути только сахар для TPL.
В первую очередь нужно разобраться, что такое TPL, как работать с Task'ами, что такое асинхронное выполнение, почему асинхронное выполнение не равно многопоточному.
Затем разобраться с синхронизацией в многопоточных приложениях, мониторы, симафоры, Read\Write локеры и прочие способы.
А потом уже переходить к async\await, иначе последний будет крайне непонятным. Если человек использует await, но не понимает, как это работает, что происходит после указания этого ключевого слова, будет много боли.
12 май 18, 22:46    [21405756]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с потоками  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
Petro123,
в принципе, async\awaite проще писать чем BackgroundWorker, я попробовал передать данные двум прогресс барам и у меня все получилось так как я хотел. Но еще один вопрос, когда я искал информацию по потокам, то где то видел что для async\awaite необходим net framework 4.5 и выше, так ли это?
12 май 18, 22:48    [21405760]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить