我有多选项卡的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;
感谢,
答案 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);