Как открыть форму в потоке и вынудить это остаться открытым

S3 - это самый дешевый вариант для хранения данных, который есть у вас в AWS, поэтому я бы посоветовал вам хранить там данные обучения.

Вы не можете реально хранить данные в экземпляре EC2, вы можете хранить их в томе основного хранилища. Это могут быть тома EBS или тома хранилища экземпляров.

Если вы используете тома EBS, то вы можете настроить их поведение после завершения работы экземпляра, чтобы вы могли указать, удалять их или нет, что означает, что даже если вы прекратите работу с экземпляром EC2, вы все равно сможете сохранить объемы, если вы выберете так.

Это невозможно в случае объемов хранилища экземпляров. Они автоматически удаляются, когда вы завершаете работу экземпляра EC2, и если вы запускаете экземпляр EC2 с сохранением экземпляра (экземпляр EC2 с корневым томом хранилища экземпляра экземпляра), вы не можете остановить его, и если произойдет какой-либо сбой, то все данные о временных объемах хранилищ экземпляров теряются.

Если вы заботитесь только о результате операции, вы можете загрузить результат на S3 и завершить работу экземпляра.

Да, вы можете смонтировать S3 bucket в свой экземпляр EC2 или просто отправить данные, используя S3 API.

Так что я предлагаю сохранить данные в S3. Когда вы будете готовы обработать его, раскрутите экземпляр EC2, извлеките данные из S3 (если ваши экземпляры S3 и EC2 находятся в одном регионе, эта передача данных бесплатна). Обработайте данные и сохраните результат на S3. Завершите работу экземпляра (или остановите его, если вам нужна такая же настройка для следующей задачи, или создайте его AMI).

Еще одна вещь, которую следует рассмотреть здесь, это тип томов, которые вы выбираете (SSD или HDD). Возможно, более разумно использовать тома с оптимизированной пропускной способностью, чем обычные твердотельные накопители (и, конечно, тип экземпляра, но вам необходимо измерить, как работает выбранный вами экземпляр и нужно ли его немного увеличить или изменить тип).

8
задан Community 23 May 2017 в 12:02
поделиться

5 ответов

На новом потоке назовите Приложение. Выполненная передача объекта формы, это заставит поток выполнить свой собственный цикл сообщения, в то время как окно открыто.

Затем можно назвать.Join на том потоке, чтобы заставить основной поток ожидать, пока поток UI не завершился или использует подобный прием для ожидания того потока для завершения.

Пример:

public void StartUiThread()
{
    using (Form1 _form = new Form1())
    {
        Application.Run(_form);
    }
}
14
ответ дан 5 December 2019 в 07:13
поделиться

Я думаю, что Ваша проблема с этой мыслью: "откройте форму на отдельном потоке, названном 'поток UI'"

Путем работы окон похожи на это (обратите внимание, что Vista может изменить некоторые из этих фактов):

Существует один важный поток, названный "Основным Потоком" или "Потоком UI". Этот поток является тем, который обрабатывает сообщения окон, как "эй, мышь нажала на этот пиксель".

Эти сообщения входят в очередь, и основной поток обрабатывает их, когда это не занято, делая что-то еще.

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

Основной поток также красит UI на экране, таким образом, продолжительное нечто () будет также мешать Вашему приложению красить.

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

Эта действительность вызывает две проблемы:

  1. ВЫХОД ИЗ ОСНОВНОГО ПОТОКА: Так как Вы не хотите, чтобы продолжительное нечто () остановило все взаимодействие с пользователем, необходимо отправить ту работу к рабочему потоку.

  2. ВОЗВРАЩЕНИЕ К ОСНОВНОМУ ПОТОКУ: Когда продолжительное нечто () завершается, Вы, вероятно, хотите уведомить пользователя путем выполнения чего-то в UI, но Вы не можете сделать этого в рабочем потоке, таким образом, необходимо "возвратиться" к основному потоку.

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

3
ответ дан 5 December 2019 в 07:13
поделиться
private void button1_Click(object sender, EventArgs e)
{
    var t = new Thread(RunNewForm);
    t.Start();
}
public static void RunNewForm()
{
     Application.Run(new Form2());
}
3
ответ дан 5 December 2019 в 07:13
поделиться

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

2
ответ дан 5 December 2019 в 07:13
поделиться

Я думаю, просто назвав ShowDialog вместо Шоу, поможет. Проблема, кажется, что поток заканчивается сразу после вызова Шоу, после этого Форма добирается, собрал "мусор". ShowDialog остановит поток, но все еще выполнит события формы на нем так, поток будет продолжать бежать, пока форма не закрывается.

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

Я также считал Ваш другой вопрос, но не мог выяснить то, что Вы пытаетесь сделать. Архитектура MVP не требует, чтобы Вы выполнили свою бизнес-логику на различных потоках. Много поточную обработку трудно сделать правильно так, я только использовал бы несколько потоков, если бы мне действительно были нужны они.

1
ответ дан 5 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: