ThreadPool 与 beginInvoke

qq2593010346 2012-10-13 04:59:50

在程序里 多次使用 ThreadPool 并在ThreadPool 的线程里调用 了程序里的其它控件.

为使不出错, 是不是得为每个线程里的控件 使用beginInvoke 和对应的 deligate 啊?

如果需要的话,那么不是非常麻烦吗?

求解,求思路
...全文
201 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ktei2008 2012-10-15
  • 打赏
  • 举报
回复
我不知道有什么麻烦的。你能举个例子么?
qldsrx 2012-10-14
  • 打赏
  • 举报
回复
的确不怎么方便,不过可以封装一个方法,通过反射方法名来调用(降低了效率)
如果不考虑XP,使用.NET4.5,将不在有多线程操作控件的麻烦,在.NET4.5里面有更好的方案处理多线程操作和控件的关系。关键字async将为你带来最大的便利。
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
在程序里 多次使用 ThreadPool 并在ThreadPool 的线程里调用 了程序里的其它控件.

为使不出错, 是不是得为每个线程里的控件 使用beginInvoke 和对应的 deligate 啊?

如果需要的话,那么不是非常麻烦吗?

求解,求思路
[/Quote]

什么叫“每个线程里控件”?

调用一句 BeginInvoke 有什么麻烦?请贴出你的代码说明。
qq286887534 2012-10-13
  • 打赏
  • 举报
回复
然后你所有controlObj.BeginInvoke都可以使用voidHandle类型,而非一一对应去声明委托.
qq286887534 2012-10-13
  • 打赏
  • 举报
回复
用lambda表达式
public Delegate void voidHandle()
controlObj.BeginInvoke((voidHandle)()=>{controlObj.Text="123";});
为了保证线程安全,必须由控件创建的线程来访问该控件,所以在子线程中,必须通过委托的方式让主线程来修改该控件的状态.
SocketUpEx 2012-10-13
  • 打赏
  • 举报
回复
     public FrmMain()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}




种草德鲁伊 2012-10-13
  • 打赏
  • 举报
回复
不需要
Windows 应用程序编程中常见的一个模式就是,在GUI用户界面下,将耗时的文件和网络处理放入 子线程,以避免用户界面不能响应的问题。在.NET出现以前,创建线 程并监视线程结束,还要更新 界面等工作,即复杂又要手写大量代码,并且难以调试。在.NET中,程序员可以通过异步调用,使 用简单的代码完成这项工作。 .NET Framework允许异步调用任何方法。使用异步调用之前,要定义一个委托,它的方法签名要与 调用方法签名一致。.NET会自动产生此委托的BeginInvoke和EndInvoke方法。 BeginInvoke 方法用于启动异步调用。它除了具有调用方法相同的参数外,还附加了两个额外的参 数,这两个额外参数将用于回调方法。 BeginInvoke执行后立即返回,并不等待异步调用完成。 BeginInvoke返回一个IAsyncResult接口,它可以用于监视调用的进度。EndInvoke方法被用来获取 异步调用的结果。在 BeginInvoke执行以后,任何时间都可以调用EndInvoke。如果异步调用尚未完 成,EndInvoke会被阻塞,直到异步调用完成。EndInvoke带有一个IAsyncResult接口类型的参数, 并返回一个IAsyncResult接口,用来获取调用结果。 本文中的代码演示了使用BeginInvoke和EndInvoke进行异步调用的四种常见调用方式。在调用 BeginInvoke之后,您可以: 1.完成一些其它工作,然后调用EndInvoke,等待异步调用完成。 2.使用IAsyncResult.AsyncWaitHandle获取一个WaitHandle,使用它的WaitOne方法执行阻塞调 用,完成后再调用EndInvoke。 3.轮询BeginInvoke返回的IAsyncResult接口,在异步调用完成后,再调用EndInvoke。 4.给BeginInvoke传递一个回调方法的委托,异步调用完成后,这个回调方法会在ThreadPool线程 上执行,可以在这个方法内调用EndInvoke。 警告:异步调用完成后,必须调用EndInvoke

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧