Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Windows Forms
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2019, 07:40   #1
Gorsania
Новичок
Джуниор
 
Регистрация: 09.12.2019
Сообщений: 1
По умолчанию Окно появляется после кода,а не до

Здравствуйте. Извините за сумбурное название.
Форма появляется только после выполнения кода, а т.к он является бесконечным циклом, то форма не появится никогда.

Код:
public MainForm()
        {
            InitializeComponent();
            Somefunc();
        }
        void Somefunc()
        {
            while (1 > 0)
            {
                DoSomething(); //TextBox_Test.Text =...
            }
        }
Мне нужно чтобы и форма была активной и Somefunc() выполнялся в фоновом режиме.
Попытка запустить Somefunc() через новый поток или таск приводит к исключению:

System.InvalidOperationException: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'TextBox_Test' не из того потока, в котором он был создан."

Использование BackgroundWorker приводит к этому же исключению. Вызов через async - тоже.

Последний раз редактировалось Gorsania; 09.12.2019 в 12:21.
Gorsania вне форума Ответить с цитированием
Старый 19.12.2019, 13:23   #2
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Код:
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private Label _lable;
        private CancellationTokenSource _tokenSource;

        public Form1()
        {
            InitializeComponent();
            _lable = new Label();
            Controls.Add(_lable);
            _lable.Dock = DockStyle.Top;
            _tokenSource = new CancellationTokenSource();
        }

        protected override async void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            try
            {
                await foreach (var str in SomefuncAsync(_tokenSource.Token)) _lable.Text = str;
            }
            catch
            {
            }
        }

        private async IAsyncEnumerable<string> SomefuncAsync([EnumeratorCancellation] CancellationToken tokenSourceToken)
        {
            while (!tokenSourceToken.IsCancellationRequested)
            {
                await Task.Delay(1000, tokenSourceToken);
                yield return DoSomething(); //TextBox_Test.Text =...
            }
        }

        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            base.OnFormClosing(e);
            _tokenSource.Cancel();
        }

        private string DoSomething()
        {
            return DateTime.Now.Second.ToString();
        }
    }
}
При использовании последнего c# можно написать так
Не давай организму поблажки, каждый день тренируй его в шашки..

Последний раз редактировалось Скарам; 19.12.2019 в 13:27.
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при нажатии на кнопку появляется новое окно I_am_ Win Api 2 08.12.2014 14:51
Появляется и быстро исчезает непонятное окно Goodwin98 Операционные системы общие вопросы 4 29.11.2013 23:50
при нажатии f9 не появляется окно для ввода данных. Antoshkaa C++ Builder 7 28.05.2013 12:16
не появляется всплывающее окно buba3230 JavaScript, Ajax 0 04.03.2013 23:02