关于C# delegate和invoke疑惑

jiazhucai 2014-07-09 11:24:13
本人是C#新手,在写一个多线程的代码,在子线程中需要调用到主线程的方法,所以用到了delegate对该方法进行了委托,后来同学说用invoke更好,所以就有点迷糊,不明白用invoke更好在哪,部分代码如下:
namespace Interface
{
// 对主线程的setFrameViewImage进行委托
delegate void deleteFrameView(IntPtr pFrame);

class RetriveFrameThread
{
private IntPtr pframe;
private RegisterForm m_Form;
private deleteFrameView dispFrameView;

public RetriveFrameThread(Form form)
{
pframe = IntPtr.Zero;
m_Form = form as RegisterForm;
if (form != null)
{
dispFrameView = new deleteFrameView(m_Form.setFrameViewImage);
}
}

public void run()
{
while (true)
{
if (CameraDll.retriveFrame(ref pframe) == 0)
{
//dispFrameView(pframe); 直接使用delegate
m_Form.Invoke(dispFrameView, pframe); 使用窗体的invoke
}
Thread.Sleep(10);
}
}
}
}

两种方法都能实现同一功能,但区别到底在何处,求论坛上的大神指导指导
...全文
17289 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunny906 2014-07-09
  • 打赏
  • 举报
回复
delegate是委托,invoke是控件的唤醒函数
tinydyw 2014-07-09
  • 打赏
  • 举报
回复
1楼和2楼都把话说完了... 只有委托是不能解决跨线程访问控件错误的....只能用invoke..
liqiucu 2014-07-09
  • 打赏
  • 举报
回复
目测你在主窗体有个控件调用了23行run方法,那么 dispFrameView(pframe); 直接使用delegate m_Form.Invoke(dispFrameView, pframe); 使用窗体的invoke 没区别的都是主线程调用 如果你不在主线程调用run那么就会有跨线程问题,这时候要用invoke了,直接调用委托会报跨线程access exception
於黾 2014-07-09
  • 打赏
  • 举报
回复
delegate是委托,本身不能解决跨线程访问控件的问题,直接调用委托还是会报错 Invoke指定用主线程中的控件去调用这个委托,相当于主线程来执行这个函数
jiazhucai 2014-07-09
  • 打赏
  • 举报
回复
引用 7 楼 tinydyw 的回复:
这不是方法的问题...用invoke是因为你的控件是ui线程创建的.而你改变值却是在ui线程以外...这时候如果使用普通的方式就会引发跨线程访问控件的异常...调用invoke则是让ui线程自己去根据参数修改控件...这是合法的.. 而你说的..既然你都开了子线程调用run()了..那么另外一个线程对主线程来说一样是子线程..只要不跨域,都能直接调用..
谢谢,没想到这么快又得到了回答
tinydyw 2014-07-09
  • 打赏
  • 举报
回复
这不是方法的问题...用invoke是因为你的控件是ui线程创建的.而你改变值却是在ui线程以外...这时候如果使用普通的方式就会引发跨线程访问控件的异常...调用invoke则是让ui线程自己去根据参数修改控件...这是合法的.. 而你说的..既然你都开了子线程调用run()了..那么另外一个线程对主线程来说一样是子线程..只要不跨域,都能直接调用..
jiazhucai 2014-07-09
  • 打赏
  • 举报
回复
没想到发帖才过了几分钟就有回帖了,非常感谢各位大神,看了各位的答案,还有一个疑问: 我在主线程开了一个子线程调用run()这个方法,那么用dispFrameView(pframe)和m_Form.Invoke(dispFrameView, pframe)都没问题,如果我在另一个线程调用这个方法,是否只能使用invoke?

111,097

社区成员

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

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

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