c#异步委托的问题
异步委托与同步委托(一般的委托)区别在哪里?一般的委托就可以理解为通过函数指针跳转执行另外一段代码,然后执行剩下的代码?异步委托是否启用了新的线程去执行另外一段代码?如果...
异步委托与同步委托(一般的委托)区别在哪里?
一般的委托就可以理解为通过函数指针跳转执行另外一段代码,然后执行剩下的代码?
异步委托是否启用了新的线程去执行另外一段代码?
如果不是,这个异步是怎么实现的?
如果是,有一个问题难以理解。
在主界面线程中启用一个异步委托更新主界面的进度条控件时,主界面会停止响应,除非显示处理消息,这不应该是启用两个线程之后应该发生的结果啊?
希望高手解答!
我重点想知道的是,异步委托是否启用了新的线程去执行代码,如果不是,它和同步委托就没有差别啊?如果是,为设么会出现上面那个难以理解的问题。 展开
一般的委托就可以理解为通过函数指针跳转执行另外一段代码,然后执行剩下的代码?
异步委托是否启用了新的线程去执行另外一段代码?
如果不是,这个异步是怎么实现的?
如果是,有一个问题难以理解。
在主界面线程中启用一个异步委托更新主界面的进度条控件时,主界面会停止响应,除非显示处理消息,这不应该是启用两个线程之后应该发生的结果啊?
希望高手解答!
我重点想知道的是,异步委托是否启用了新的线程去执行代码,如果不是,它和同步委托就没有差别啊?如果是,为设么会出现上面那个难以理解的问题。 展开
3个回答
展开全部
1.是多线程,不算异步。
2.BeginAccept是异步,虽然你的程序中用myreset.WaitOne();进入了等待事件的过程。如果不等待事件,就可以继续运行下面的程序了。
我的经验是,这种情况就不用异步。
3.回调当然会消耗系统资源。大数据的话,我建议用线程循环做。
4.同步就会阻塞,异步主线程不阻塞,当需要监听后,还需要做一些其他处理的话,就用异步,如果一切就绪等待连接的,就用同步比较好。
5.委托给了.net框架,内部应该也是线程和阻塞。
路过,不足之处,请继续问。
2.BeginAccept是异步,虽然你的程序中用myreset.WaitOne();进入了等待事件的过程。如果不等待事件,就可以继续运行下面的程序了。
我的经验是,这种情况就不用异步。
3.回调当然会消耗系统资源。大数据的话,我建议用线程循环做。
4.同步就会阻塞,异步主线程不阻塞,当需要监听后,还需要做一些其他处理的话,就用异步,如果一切就绪等待连接的,就用同步比较好。
5.委托给了.net框架,内部应该也是线程和阻塞。
路过,不足之处,请继续问。
展开全部
你这样当然主界面停止响应了,你使用异步委托去操作主界面的进度条,实际上和在主界面操作一样。换个方式,用backgroundwork控件去做,
BackgroundWorker bgWork = new BackgroundWorker();
bgWork.DoWork += new DoWorkEventHandler(DoWork);
bgWork.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunCompleted);
bgWork.ProgressChanged += new ProgressChangedEventHandler(ProgressChanged);
bgWork.WorkerReportsProgress = true;
bgWork.RunWorkerAsync(opType);
/// <summary>
/// 背景线程状态报告事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBarControl1.Text = e.ProgressPercentage.ToString();
}
这样就可以了
BackgroundWorker bgWork = new BackgroundWorker();
bgWork.DoWork += new DoWorkEventHandler(DoWork);
bgWork.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunCompleted);
bgWork.ProgressChanged += new ProgressChangedEventHandler(ProgressChanged);
bgWork.WorkerReportsProgress = true;
bgWork.RunWorkerAsync(opType);
/// <summary>
/// 背景线程状态报告事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBarControl1.Text = e.ProgressPercentage.ToString();
}
这样就可以了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
嗯,就是那个意思。委托执行结果是否需要立即返回的问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询