winforms在标签之间切换,而当前标签正在忙于处理

时间:2011-09-21 15:18:48

标签: c# .net winforms multithreading

我有多选项卡的winform(c#),当前关注的选项卡正在忙于执行冗长的异步操作和嵌入的progressbasr“在该选项卡中”显示进度。我想让用户能够导航到其他选项卡并执行其他任务,以防他/她不想等待。那我怎么能以简单而有力的方式做到这一点?

这是冗长的操作:

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();

 }

我必须使用线程吗?!还是更简单的方式?请提供代码段或有用的来源。

编辑:

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

感谢,

2 个答案:

答案 0 :(得分:1)

你需要长期运行'在单独的线程或后台工作者中操作。在这种情况下,UI将是免费的,用户可以继续使用应用程序。但是不要忘记在操作完成时通知用户。

以下是样本:

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();

答案 1 :(得分:1)

如果您已经异步执行任务,那么用户应该已经能够在选项卡之间切换,因为异步操作不会阻止UI线程。

如果您不是异步执行任务,则用户将无法执行任何操作,因为您正在阻止UI线程。

话虽如此,我怀疑你是在第二阵营,所以这样的事情可以帮助你开始:

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);