winforms переключаются между вкладками, пока текущая занята обработкой - PullRequest
1 голос
/ 21 сентября 2011

У меня есть winform (c #) с несколькими вкладками, текущая выделенная вкладка занята выполнением длительной асинхронной операции и встроенным индикатором прогресса "в этой вкладке", показывающим прогресс. Я хочу, чтобы пользователь мог переходить на другие вкладки и выполнять другие задачи, если он / она не хочет ждать. так как я могу сделать это простым и надежным способом?

это короткая операция:

foreach (DataRow _dr in _allDt.Rows)
{
   //check if machine is online out of 100 machines list using async approach
        if (_connectionUtil.ConnectionIsOn(_dr["ipAddress"].ToString()))
            _onMachineAl.Add(_machineInfo);
    _progressBar.PerformStep();

 }

я должен использовать нить ?! или более простой способ доступен? пожалуйста, предоставьте фрагмент кода или полезный источник.

EDIT:

//async part:
 using (TcpClient tcpClient = new TcpClient())
            {
                IAsyncResult result = tcpClient.BeginConnect(ipAddress, 3306, null, null);
                WaitHandle timeoutHandler = result.AsyncWaitHandle;

спасибо,

Ответы [ 2 ]

1 голос
/ 21 сентября 2011

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

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

При этом я подозреваю, что вы находитесь во втором лагере, поэтому что-то вроде этого должно помочь вам начать:

var mi = new MethodInvoker(() =>
{
    foreach(dataRow _dr in _allDt.Rows)
    {
        if(_connectionUtil.ConnectionIsOn(_dr["ipAddress"].ToString()))
            _onMachineAl.Add(_machineInfo);
        this._progressBar.Invoke(() => { _progressBar.PerformStep(); });
    }
});
mi.BeginInvoke(null, null);
1 голос
/ 21 сентября 2011

Вам нужно запустить свою «долгую» операцию в отдельном потоке или в фоновом режиме.В этом случае пользовательский интерфейс будет бесплатным, и пользователь сможет продолжить работу с приложением.Но не забудьте уведомить пользователя о завершении операции.

Вот пример:

new System.Threading.Thread(new System.Threading.ThreadStart(delegate() 
    {
        foreach (DataRow _dr in _allDt.Rows)
        {
            //check if machine is online out of 100 machines list using async approach
            if (_connectionUtil.ConnectionIsOn(_dr["ipAddress"].ToString()))
                _onMachineAl.Add(_machineInfo);

            this._progressBar.Invoke(new MethodInvoker(delegate() // Invoke you need for accessing the UI thread and controls
            { 
                _progressBar.PerformStep();
            }));

        }
    })).Start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...