C # инициализировать объекты с помощью задачи - PullRequest
0 голосов
/ 25 октября 2018

У меня есть какой-то сторонний класс ', который (по некоторым причинам) тяжело инициализировать.Тогда я подумал, что если бы я мог инициализировать их параллельно, я мог бы сократить время загрузки.

Разве это не должно быть хорошо?Или есть что-то, что я не принимаю во внимание?Я не получаю никаких ошибок, однако вижу, что «остальная часть кода» выдает другой и неправильный результат, когда я просто инициализирую их нормально.Может ли это быть чем-то внутри стороннего класса, которому не нравится параллельная инициализация?

У меня есть base class и несколько child class's.Внутри моего child Class's я инициализирую сторонний класс '

Мой код выглядит примерно так:

public ChildClass1 test1;
public ChildClass2 test2;

private void button2_Click(object sender, EventArgs e)
{


Stopwatch MainWatch = new Stopwatch();
MainWatch.Start();

Task task1 = new Task(() => test1 = new ChildClass1());
task1.Start();

Task task2 = new Task(() => test2 = new ChildClass2());
task2.Start();

Task.WaitAll(task1, task2);
MainWatch.Stop();

//Rest of the code...

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

public ChildClass1 test1;
public ChildClass2 test2;

private async void button2_Click(object sender, EventArgs e)
{


Stopwatch MainWatch = new Stopwatch();
MainWatch.Start();

await Task.Run(() => test1 = new ChildClass1());

await Task.Run(() => test2 = new ChildClass2());


await Task.WhenAll();
MainWatch.Stop();

//Rest of the code...

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Помимо того факта, что инициализация может действительно не быть поточно-ориентированной (знает только поставщик), если на самом деле инициализация занимает так много времени, то, возможно, распараллеливание все еще не лучшее решение, так каквпереди еще много работы.

К сожалению, ваш пример очень общий.Так что не ясно, что вы на самом деле хотите сделать.Если выполняемая работа настолько тяжелая, вам, вероятно, не следует делать все это при нажатии кнопки.Щелчок должен запускать только операцию, тогда вы могли бы показать индикатор загрузки, например, на пользовательском интерфейсе (возможно, отключить кнопку во время работы), и, наконец, сделать все, что вы хотите сделать, когда операция будет завершена.

0 голосов
/ 25 октября 2018

Может ли это быть чем-то из стороннего класса, которому не нравится параллельная инициализация?

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

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

...