0

Столкнулся с такой проблемой, в юнити для асинхронных действий есть очень удобный инструменты IEnumerator, для C# я нагуглил async, но не понял как этим пользоваться

void Start()
{
    StartCoroutine(someCoroutine());
}

IEnumerator someCcoroutine() { yield return new WaitForSeconds(1.0f); }

Есть-ни что-то подобное в WinForms и как это использовать? К примеру, мне нужно запустить таймер ожидания в отдельном потоке, чтобы потом в нем-же запустить некоторые действия. При этом основной поток должен продолжать свою стандартную работу

  • 1
    https://ru.stackoverflow.com/a/1257322/220553 – EvgeniyZ Sep 20 '21 at 12:21
  • @EvgeniyZ, а эти функции можно как-нибудь вызывать? –  Sep 20 '21 at 12:37
  • 1
    Зачем корутины в формах? – tym32167 Sep 20 '21 at 13:29
  • @tym32167, мне нужно вызвать дополнительный поток, в котором произойдет какое-то действие, через 3 секунды. И во время ожидания этих 3х секунд выполнение основной программы не остановится. И таких задержек должно быть 10 для каждого отдельного объекта –  Sep 21 '21 at 00:13
  • Для этого не нужны корутины. Ожидайте асинхронно, вызывайте свои задачи через пул потоков. – tym32167 Sep 21 '21 at 00:49
  • @tym32167 Не мог-бы ты на примере показать, как это работает? –  Sep 21 '21 at 01:31
  • закинул пример ответом – tym32167 Sep 21 '21 at 01:46

1 Answers1

1

Пример, как по нажатию кнопки подождать 3 секунды асинхронно и запустить какую то работу на пуле потоков

class MyForm : Form
{
    public MyForm()
    {
        var button = new Button() { Text = "Press me!", Width = 200, Height = 50 };
        button.Click+=button_click;
        this.Controls.Add(button);
    }
private async void button_click(object sender, EventArgs args){
    await Task.Delay(3000); // ждем 3 секунды
    await Task.Run(() => {
        // Ваш код тут, 
        // только не пытайтесь работать с элементами формы 
        // из этого потока, не получится. 
        MessageBox.Show("boom!");
    });
}

}

Результат

...

tym32167
  • 32,857
  • Не знал, что MessageBox.Show можно вызывать не из гуи-потока... – 4per Sep 21 '21 at 04:24
  • @4per это же win32 api, там практически все функции потокобезопасны. – aepot Sep 21 '21 at 06:46
  • 1
    В методах типа async void стоит обрабатывать вероятные исключения, в противном случае разработчик их не увидит. – aepot Sep 21 '21 at 07:01
  • 1
    @aepot в данном случае исключение всплывет в ui поток, разве нет? Да и в любом случае, ответ явно не про обработку исключений. – tym32167 Sep 21 '21 at 13:16