Georg Kohler Ответов: 1

Предоставление переменных для новой задачи


Я часто использую следующую базовую структуру для запуска параллельной задачи, когда я этого не делаю
нужно дождаться результата

Private sub yyy()
 
Dim SUB_VAR1  as  string = xxx
Dim SUB_Var2 as integer = xxx

Dim T1 as new task(sub)
 Dim TASK_VAR1 as String = SUB_VAR1
 Dim TASK_VAR2 as Integer = SUB_VAR2 
...
... 'do some work within the task and the TASK_Variable(s)
...
...
End Sub)

T1.Start()

End sub


Здесь нет никаких проблем - но вот мой вопрос

Гарантируется ли, что мои значения SUB_variable всегда будут перенесены в Task_VARIABLES до того, как я начну задачу, или это произойдет позже (надеюсь, что нет :-)) ... Если это произойдет позже, то Sub_variables могут больше не присутствовать, и я получу исключения ...

PS Я просто пытаюсь понять, как это на самом деле обрабатывается

Что я уже пробовал:

Для меня это скорее общий вопрос...

Ralf Meier

Извиняюсь... В данный момент я не понимаю вашего вопроса, а также не понимаю вашей проблемы.
Пожалуйста, предоставьте свою полную кодовую часть.
В соответствии с вашим фактическим кодом : почему вы создаете экземпляр своей задачи внутри вашего метода (sub) ?

Graeme_Grant

Глядя на ваш код и читая ваш вопрос, вы спрашиваете о TPL[^ но кодирование от Нарезание резьбы[^], два совершенно разных способа выполнения многозадачности. Поэтому вам нужно предоставить больше кода с четким описанием и четким вопросом о том, где вы застряли, чтобы мы могли лучше понять и лучше указать вам правильное направление.

1 Ответов

Рейтинг:
0

OriginalGriff

Ответ прост: "да".
И "Нет".
И "Может Быть".

И все они одновременно истинны ... все идет немного квантово ...

Потоковая обработка не является простой, хотя бы потому, что она изначально недетерминирована: у вас мало или вообще нет контроля над тем, когда что-то происходит, потому что система контролирует это, в зависимости от нагрузки на машину и количества ядер, доступных для обработки потоков.
Запуск нового потока не означает, что он запускается немедленно, он добавляет его в "пул потоков" задач, которые система должна выполнить, и когда есть свободное ядро, и оно достигает вершины списка, оно будет выполнено. Но... поток, запустивший новую задачу, также является частью пула, и Windows является упреждающей (что означает, что она приостановит выполнение задач, чтобы дать другим шанс), поэтому ваш новый поток может работать до завершения до того, как метод Start вернется в исходный поток, или он может работать в то же время (на другом ядре), что и исходный код потока, или он может подождать полчаса, а затем сделать свое дело.

И у вас нет никакого существенного контроля над тем, какой порядок используется, если вы не начнете кодировать блокировки, мьютексы и т. д. чтобы гарантировать, что все произойдет именно тогда, когда вы этого ожидаете.

Так... учитывая, что ваш SUB_xxx значения являются локальными для yyy метод они могут существовать или нет, когда ваша задача действительно начинает выполняться.

Вместо того чтобы полагаться на удачу, чтобы получить свои значения, передайте их в качестве параметров задаче, и вы гарантируете, что значения будут обработаны задачей: vb.net - Visual Basic .NET: как создать задачу из метода с параметрами - переполнение стека[^]