Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Прошу научить запускать таски на VB.NET / 25 сообщений из 91, страница 1 из 4
09.12.2018, 16:17
    #39744956
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Приветствую присутствующих. Я как бы не совсем чайник, но чувствую себя полным нулем в тасках.

Есть процедура, которая берет DataRow как параметр и должна запускаться асинхронно:
Код: vbnet
1.
2.
3.
Private Async Sub OneRecord(dr As DataRow)
...
End Sub


Есть цикл, который ее должен вызвать:
Код: vbnet
1.
2.
3.
4.
For Each dr As DataRow In dsRecords.Tables(0).Rows
    Dim t As Task = New Task(New Action(AddressOf OneRecord))
    t.Start()
Next


Вопрос 1. Как сюда вставить передачу параметра dr?
Вопрос 2. У меня еще светится сообщение, что в процедуре OneRecord отсутствуют операторы Await и поэтому она не будет запускаться асинхронно. Куда вставлять Await?

Пытался читать старые обсуждения, но ничего там не понял. Заранее спасибо.
...
Рейтинг: 0 / 0
09.12.2018, 17:19
    #39744972
WebPrj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Владимир Саныч,
Весь цикл в асинхронную процедуру. Передать туда строку коннекта.
...
Рейтинг: 0 / 0
09.12.2018, 17:35
    #39744976
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Без Await и прочих Async можно так


Код: 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.
using System.Collections.Generic;
using System.Data;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet ds = new DataSet();
            DataTable dt = new DataTable("first");
            ds.Tables.Add(dt);

            //Вот так можно просто запустить много потоков без ожидания их выполнения
            foreach (DataRow dr in ds.Tables["first"].Rows)
            {
                Task.Factory.StartNew(() =>
                {
                    doit(dr);
                });
            }
            //Вот так можно запустить много потоков и ждать, пока они все выполнятся
            List<Task> tasks = new List<Task>();
            foreach (DataRow dr in dt.Rows)
            {
                tasks.Add(
            Task.Factory.StartNew(() =>
            {
                doit(dr);
            }));
            }
            Task.WaitAll(tasks.ToArray());
        }
        static void doit(DataRow dr)
        {

        }
    }
    
}
...
Рейтинг: 0 / 0
09.12.2018, 17:43
    #39744978
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Ах да. Переводчик

Код: vbnet
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.
Imports System.Collections.Generic
Imports System.Data
Imports System.Threading.Tasks
Namespace ConsoleApplication1
	Class Program
		Shared Sub Main(args As String())
			Dim ds As New DataSet()
			Dim dt As New DataTable("first")
			ds.Tables.Add(dt)
			For Each dr As DataRow In ds.Tables("first").Rows
				Task.Factory.StartNew(Function() 
				doit(dr)

End Function)
			Next
			Dim tasks As New List(Of Task)()
			For Each dr As DataRow In dt.Rows
				tasks.Add(Task.Factory.StartNew(Function() 
				doit(dr)

End Function))
			Next
			Task.WaitAll(tasks.ToArray())
		End Sub
		Shared Sub doit(dr As DataRow)
		End Sub
	End Class
End Namespace
...
Рейтинг: 0 / 0
09.12.2018, 17:54
    #39744979
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
WebPrjВесь цикл в асинхронную процедуру. Передать туда строку коннекта.
И цикл будет переходить к следующей записи, не дожидаясь обработки предыдущей???

Cat2 Переводчик
О, это очень ценная штука, спасибо.
...
Рейтинг: 0 / 0
09.12.2018, 18:03
    #39744981
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Владимир СанычИ цикл будет переходить к следующей записи, не дожидаясь обработки предыдущей???
Да. Но надо учитывать, что в какой-то момент множество открытых потоков начинают тормозить
...
Рейтинг: 0 / 0
09.12.2018, 18:04
    #39744982
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Cat2Владимир СанычИ цикл будет переходить к следующей записи, не дожидаясь обработки предыдущей???
Да. Но надо учитывать, что в какой-то момент множество открытых потоков начинают тормозить
Ой, это не к моему коду вопрос был.
...
Рейтинг: 0 / 0
09.12.2018, 18:07
    #39744983
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Cat2Ой, это не к моему коду вопрос был.

Таки да. Но "начинают тормозить" - это глобальная проблема. Я попробую поставить какой-нибудь Sleep, только бы он тоже не начал исполняться асинхронно...
...
Рейтинг: 0 / 0
09.12.2018, 18:14
    #39744985
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
И еще вопрос. Локальные переменные, описанные в этой вызываемой асинхронно процедуре, у каждого вызова свои? Мне кажется, что одни и те же и разные вызовы затирают их друг другу.
...
Рейтинг: 0 / 0
09.12.2018, 18:50
    #39744990
WebPrj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Владимир СанычWebPrjВесь цикл в асинхронную процедуру. Передать туда строку коннекта.
И цикл будет переходить к следующей записи, не дожидаясь обработки предыдущей???

Смотря что надо.
В одном случае будет переключение контекста и создание кучи задач....забитие пула потоков.
С другой стороны будет фоновое последовательное выполнение.
...
Рейтинг: 0 / 0
09.12.2018, 19:09
    #39744992
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Владимир СанычCat2Ой, это не к моему коду вопрос был.

Таки да. Но "начинают тормозить" - это глобальная проблема. Я попробую поставить какой-нибудь Sleep, только бы он тоже не начал исполняться асинхронно...
Есть более изящные решения
...
Рейтинг: 0 / 0
09.12.2018, 21:49
    #39745022
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
WebPrjСмотря что надо.
Надо то, что сказано в исходном посте: запускать асинхронно процедуру, обрабатывающую отдельную запись.

WebPrjВ одном случае будет переключение контекста и создание кучи задач....забитие пула потоков.
А в другом?

WebPrjС другой стороны будет фоновое последовательное выполнение.
Это ровно то, что у меня было до того, как я стал пытаться использовать асинхронность.
...
Рейтинг: 0 / 0
09.12.2018, 21:50
    #39745024
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Cat2Есть более изящные решения
Например?
...
Рейтинг: 0 / 0
09.12.2018, 22:48
    #39745034
WebPrj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Владимир СанычЭто ровно то, что у меня было до того, как я стал пытаться использовать асинхронность.
что то вы лукавите.
Если одна задача с циклом внутри, то это один поток и готовая асинхронность.
А вы говорите - это было ДО использования асинхронности.
Любое решение это компромиссы.
Если нужно запустить 100 микрозадачек на 100 строках то запускайте.
AFAIK пул там на 50 максимуму и остальные 50 встанут в очередь.
Делайте.
...
Рейтинг: 0 / 0
09.12.2018, 23:15
    #39745040
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
WebPrjЕсли одна задача с циклом внутри, то это один поток и готовая асинхронность.
Записи обрабатывались последовательно. Надо параллельно.
...
Рейтинг: 0 / 0
09.12.2018, 23:27
    #39745042
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Владимир Саныч,

Чем задачки занимаются - рассчётами или вводом-выводом?
...
Рейтинг: 0 / 0
09.12.2018, 23:33
    #39745043
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
ИзопропилВладимир Саныч,

Чем задачки занимаются - рассчётами или вводом-выводом?
Передачей информации в другую систему. Процедура берет несколько чисел из одной записи, обращается с ними к другой системе, получает обратно несколько других чисел, заносит в ту же запись.
...
Рейтинг: 0 / 0
09.12.2018, 23:38
    #39745044
WebPrj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Владимир СанычWebPrjЕсли одна задача с циклом внутри, то это один поток и готовая асинхронность.
Записи обрабатывались последовательно. Надо параллельно.
я ответил - делайте.
Только чтение потокобезопасно. Записывать нельзя без синхронизации.
...
Рейтинг: 0 / 0
09.12.2018, 23:46
    #39745045
WebPrj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Владимир СанычИзопропилВладимир Саныч,

Чем задачки занимаются - рассчётами или вводом-выводом?
Передачей информации в другую систему. Процедура берет несколько чисел из одной записи, обращается с ними к другой системе, получает обратно несколько других чисел, заносит в ту же запись.
Для этого существует вариант - быстро читают коллекцию и передают коллекцию в другую систему.
...
Рейтинг: 0 / 0
10.12.2018, 00:46
    #39745054
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
WebPrjя ответил - делайте.
Да-да, я именно потому и обратился сюда, что точно знаю, как делать, а вот делать или нет - не знал. Спасибо большое за этот очень ценный совет. Теперь буду знать: надо делать. Забыл поблагодарить Вас за предыдущую реплику, заставил повторять, извините.

WebPrjДля этого существует вариант - быстро читают коллекцию и передают коллекцию в другую систему.
А совет переписать ту систему вообще бесценен, еще раз спасибо.
...
Рейтинг: 0 / 0
10.12.2018, 05:59
    #39745077
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Владимир Саныч
Код: vbnet
1.
2.
3.
Private Async Sub OneRecord(dr As DataRow)
...
End Sub


Настоятельно рекомендуется использовать async Task вместо async void (Async Sub)
...
Рейтинг: 0 / 0
10.12.2018, 06:59
    #39745083
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Владимир СанычCat2Есть более изящные решения
Например?

https://toster.ru/q/545984

Второй пример
...
Рейтинг: 0 / 0
10.12.2018, 07:16
    #39745085
WebPrj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Владимир Саныч,
Мы до тасков еще не дошли).
Вы же написали что новичок.
Теперь делаете пример с первой страницы.
Именно без тасков.
Ну а потом будут таски с возвратом.
...
Рейтинг: 0 / 0
10.12.2018, 07:20
    #39745087
WebPrj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Владимир СанычWebPrjя ответил - делайте.
Да-да, я именно потому и обратился сюда, что точно знаю, как делать, а вот делать или нет - не знал. Спасибо большое за этот очень ценный совет. Теперь буду знать: надо делать. Забыл поблагодарить Вас за предыдущую реплику, заставил повторять, извините.

WebPrjДля этого существует вариант - быстро читают коллекцию и передают коллекцию в другую систему.
А совет переписать ту систему вообще бесценен, еще раз спасибо.
Столько написали всего, а про запись в потоках промолчали.
...
Рейтинг: 0 / 0
10.12.2018, 07:49
    #39745094
WebPrj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу научить запускать таски на VB.NET
Вот, добавил в код выше от Cat2. Подходит?
И ничего тормозить не надо.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 
            //Вот так можно просто запустить много потоков без ожидания их выполнения
            foreach (DataRow dr in ds.Tables["first"].Rows)
            {
                Task.Factory.StartNew(() =>
                {
                   strung s = await ОбработатьЗаписьПолностью(dr);
                   Console. WriteLine(s) 
                });
            }
            
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Прошу научить запускать таски на VB.NET / 25 сообщений из 91, страница 1 из 4
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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