vb.net 如何让Invoke带参数?

aa6103848252 2010-07-04 12:12:07
PictureBox1.Invoke(New MethodInvoker(Addressof 过程名)),但这个过程有参数,如何让他带参数运行?
...全文
2041 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hztltgg 2010-07-06
  • 打赏
  • 举报
回复
看你的代码,你应该是在写一个有后台线程的处理图片框这种前台界面的东西

由于存在线程不安全的情况,所以一般是不允许后台线程直接处理前台UI的东西的,就像后台线程给前台文本框赋值都不允许,只能通过Invoke来实现,这个invoke一般理解就是跨一个平台的意思

委托是将一个方法最为一个参数传递,就是将一个方法包装成一个类的意思
你这儿的委托就可以理解为后台代码委托前台代码修改UI,而不是后台代码直接修改前台UI
aa6103848252 2010-07-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hztltgg 的回复:]

多线程参数的处理比你想的要麻烦,在start里带参数可以传递到Dowork方法中,不过只有一个参数吧,你要封装一下,当msdn里是说:此重载和 ParameterizedThreadStart 委托使得将数据传递给线程过程变得简单,但由于可以将任何对象传递给此重载,所以这种方法并不是类型安全的。 将数据传递给线程过程的一个更可靠的方法是将线程过程和数据字段都放入辅助对象。有关更多信息,请参见 启……
[/Quote]

谢谢hztltgg耐心的回答,再问最后一个问题好吗?
Invoke是干什么的,什么是委托?谢谢!
hztltgg 2010-07-05
  • 打赏
  • 举报
回复
多线程参数的处理比你想的要麻烦,在start里带参数可以传递到Dowork方法中,不过只有一个参数吧,你要封装一下,当msdn里是说:此重载和 ParameterizedThreadStart 委托使得将数据传递给线程过程变得简单,但由于可以将任何对象传递给此重载,所以这种方法并不是类型安全的。 将数据传递给线程过程的一个更可靠的方法是将线程过程和数据字段都放入辅助对象。有关更多信息,请参见 启动时创建线程并传递数据。

Dim newThread As New Thread(AddressOf Work.DoWork)

newThread.Start(42)

Public Shared Sub DoWork(ByVal data As Object)
Console.WriteLine("Static thread procedure. Data='{0}'", _
data)
End Sub
aa6103848252 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hztltgg 的回复:]

Dim arg(1) As Object
arg(0) = "a"
arg(1) = 2
PictureBox1.Invoke(AddressOf 过程名, arg)
[/Quote]

hztltgg,谢谢你,Inkove的会了,可thread如何带参数呢?
Dim BlurThread As New Threading.Thread(AddressOf Blur)
BlurThread.IsBackground = True
BlurThread.Start
'Blur有两个参数,这里如何带上参数呢?
cmlr_ 2010-07-05
  • 打赏
  • 举报
回复
什么叫自带的?讲明白些..
hztltgg 2010-07-05
  • 打赏
  • 举报
回复
Dim arg(1) As Object
arg(0) = "a"
arg(1) = 2
PictureBox1.Invoke(AddressOf 过程名, arg)
hztltgg 2010-07-05
  • 打赏
  • 举报
回复
msdn里,只是说了EventHandler 和MethodInvoker 这那个类型的委托比较快,并没有限制用什么委托:

委托可以是 EventHandler 的实例,在此情况下,发送方参数将包含此控件,而事件参数将包含 EventArgs.Empty 。 委托还可以是 MethodInvoker 的实例或采用 void 参数列表的其他任何委托。 调用 EventHandler 或 MethodInvoker 委托比调用其他类型的委托速度更快。

EventHandler 委托 表示将处理不包含事件数据的事件的方法。
MethodInvoker 委托 表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。
hztltgg 2010-07-05
  • 打赏
  • 举报
回复
New MethodInvoker 这个new出来的就是一个声明为 void 且不接受任何参数的任何方法的委托

就是你不要用New MethodInvoker
aa6103848252 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hztltgg 的回复:]

msdn

MethodInvoker 委托
表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。

Control.Invoke 方法有那个重载
Control.Invoke (Delegate) 在拥有此控件的基础窗口句柄的线程上执行指定的委托。
Control.Invoke (Delegate, Object[]) 在拥有控件的基础窗口句柄……
[/Quote]

第二个怎么用?
PictureBox1.Invoke(New MethodInvoker(Addressof 过程名),参数),这样不对啊
hztltgg 2010-07-05
  • 打赏
  • 举报
回复
msdn

MethodInvoker 委托
表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。

Control.Invoke 方法有那个重载
Control.Invoke (Delegate) 在拥有此控件的基础窗口句柄的线程上执行指定的委托。
Control.Invoke (Delegate, Object[]) 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托。

为什么你一定要用第一个重载而不用第二个呢?

aa6103848252 2010-07-05
  • 打赏
  • 举报
回复
晕,我要自带的那种,谁能鞠躬例子啊,5555555555
wuyq11 2010-07-04
  • 打赏
  • 举报
回复
Control.Invoke(new A(B), new Object[] { ""});
看看MSDN
cmlr_ 2010-07-04
  • 打赏
  • 举报
回复
调用的时候这样用

sub button1_click() handles button1.click
invmethod(val(text1.text),val(text2.text))
end sub

很简单的
cmlr_ 2010-07-04
  • 打赏
  • 举报
回复
不用MethodInvoker,而是自己写一个委托

Delegate de1(byval x as integer,byval y as interger)
dim mydeg as de1
sub form_load() handles mybase.load
mydeg=adressof invmethod
end sub
sub invmethod(x as integer ,y as integer)
if me.invokerequired then
me.invoke mydeg
else
label1.text=x.tostring
lable2.text=y.tostring
end if
end sub

纯手工写的代码,只是提供一个方法,其中有可能会有错误,放在ide里纠正一下很好办的
aa6103848252 2010-07-04
  • 打赏
  • 举报
回复
看不懂MSDN的,能给过例子么?比如要调用一个过程A,有参数b,c,d,e As Int,怎么写?

16,557

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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