调用方法 [英] Invoke Method

查看:55
本文介绍了调用方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述




我正在寻找一种方法,允许调用一个将被执行的方法

由主应用程序线程bu将被调用我手动创建的线程。

(我认为技术上类似于向

程序发送消息)


我尝试了Invoke方法,但它似乎可以在调用线程中工作


谢谢,

Shmuel Shulman

推荐答案

S Shulman


我今天做了这个,因为我对某些事感到好奇,也许你可以使用

吧。


\\\需要一个带有列表框的表格

Private Sub Form1_Load(ByVal sender As System.Object,_

ByVal e As System.EventArgs)Handles MyBase.Load

Dim myQ As New Queue

Dim myreadDb As新的readDatabase(myQ)

Dim MyThr As New System.Threading.Thread(AddressOf myreadDb.Read)

MyThr.Start()

Me.Show()

Do until myreadDb.ready AndAlso myQ.Count = 0

SyncLock myQ.SyncRoot

如果myQ.Count> 0然后

Me.ListBox1.Items.Add(myQ.Dequeue)

Me.ListBox1.SelectedIndex = ListBox1.Items.Count - 1

Me.ListBox1.Show()

结束如果

结束SyncLock

循环

结束子
结束班

公共类readDatabase

私人MyQ作为队列

朋友准备好作为布尔值

Public Sub New(ByVal pMyQ As Queue)

MyQ = pMyQ

End Sub

Friend Sub Read()

Dim fi As New IO.FileInfo(" c:\ test1 \ db3.mdb")

如果不是fi.Exists那么

Dim db作为新的CreateDB

结束如果

Dim conn As New

OleDb.OleDbConnection(" Provider = Microsoft.Jet.OLED B.4.0;&& ; _

"数据源= C:\ Test1 \ db3.mdb;用户

Id = admin;密码=;")

Dim cmd As New OleDb.OleDbCommand(" select count(*)from Test" conn)

conn.Open()

Dim count As Integer = CINT(CMD .ExecuteScalar())

cmd.CommandText =" Select * from Test"

Dim drdr As OleDb.OleDbDataReader

drdr = cmd。 ExecuteReader()

当drdr.Read()

SyncLock MyQ.SyncRoot

MyQ.Enqueue(drdr.GetInt32(1))

结束SyncLock

结束时

ready = True

drdr.Close()

conn.Close()

End Sub

结束班

朋友类CreateDB

Public Sub New()

昏暗的catNewDB作为新的ADOX.Catalog

Dim fi作为新的IO.FileInfo(" c:\ test1 \db3.mdb")

if fi.Exists Then

If MessageBox.Show(" Delete?"," Existing File db3.mdb",_

MessageBoxButtons.YesNo)= DialogResult.Yes然后

fi.Delete()

否则

退出Sub

结束如果

结束如果

catNewDB.Create(" Provider = Microsoft.Jet.OLEDB.4.0; " &安培; 数据

来源= C:\ test1 \db3.mdb"

Dim conn As New

OleDb.OleDbConnection(" ; Provider = Microsoft.Jet.OLED B.4.0;"& _

" Data Source = C:\ Test1 \ db3.mdb; User Id = admin; Password =;" ;)

Dim cmd As New OleDb.OleDbCommand(" CREATE TABLE Test(& _

" Gid uniqueidentifier,"& _

" NextN int,"& _

" CONSTRAINT [pk_Gid] PRIMARY KEY(Gid))",conn)

conn。打开()

cmdExecute(cmd)

cmd.CommandText =" INSERT INTO Test(Gid,NextN)VALUES(?,?)"

cmd.Parameters.Add _

(新OleDb.OleDbParameter(",OleDb.OleDbType.Guid))

cmd.Parameters.Add _

(新OleDb.OleDbParameter(",OleDb.OleDbType.Integer))

我的整数= 0到20000

cmd .Parameters(0).Value = Guid.NewGuid

cmd.Parameters(1).Value =我

cmdExecute(cmd)

下一页

conn.Close()

结束子

Private Sub cmdExecute(ByVal cmd As OleDb.OleDbCommand)

尝试

cmd.ExecuteNonQuery()

Catch ex As OleDb.OleDbException

MessageBox.Show(ex.Message," OleDbException")

退出Sub

Catch ex As Exception

MessageBox.Show(ex.Message," GeneralException")

退出Sub

结束尝试

结束子

结束班

///

我希望这有点帮助吗?


Cor
S Shulman

I made this today because I was curious about someting, maybe can you use
it.

\\\Needs a form with a listbox on it
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim myQ As New Queue
Dim myreadDb As New readDatabase(myQ)
Dim MyThr As New System.Threading.Thread(AddressOf myreadDb.Read)
MyThr.Start()
Me.Show()
Do Until myreadDb.ready AndAlso myQ.Count = 0
SyncLock myQ.SyncRoot
If myQ.Count > 0 Then
Me.ListBox1.Items.Add(myQ.Dequeue)
Me.ListBox1.SelectedIndex = ListBox1.Items.Count - 1
Me.ListBox1.Show()
End If
End SyncLock
Loop
End Sub
End Class
Public Class readDatabase
Private MyQ As Queue
Friend ready As Boolean
Public Sub New(ByVal pMyQ As Queue)
MyQ = pMyQ
End Sub
Friend Sub Read()
Dim fi As New IO.FileInfo("c:\test1\db3.mdb")
If Not fi.Exists Then
Dim db As New CreateDB
End If
Dim conn As New
OleDb.OleDbConnection("Provider=Microsoft.Jet.OLED B.4.0;" & _
" Data Source=C:\Test1\db3.mdb;User
Id=admin;Password=;")
Dim cmd As New OleDb.OleDbCommand("select count(*) from Test", conn)
conn.Open()
Dim count As Integer = CInt(cmd.ExecuteScalar())
cmd.CommandText = "Select * from Test"
Dim drdr As OleDb.OleDbDataReader
drdr = cmd.ExecuteReader()
While drdr.Read()
SyncLock MyQ.SyncRoot
MyQ.Enqueue(drdr.GetInt32(1))
End SyncLock
End While
ready = True
drdr.Close()
conn.Close()
End Sub
End Class
Friend Class CreateDB
Public Sub New()
Dim catNewDB As New ADOX.Catalog
Dim fi As New IO.FileInfo("c:\test1\db3.mdb")
If fi.Exists Then
If MessageBox.Show("Delete?", "Existing File db3.mdb", _
MessageBoxButtons.YesNo) = DialogResult.Yes Then
fi.Delete()
Else
Exit Sub
End If
End If
catNewDB.Create("Provider=Microsoft.Jet.OLEDB.4.0; " & "Data
Source=C:\test1\db3.mdb")
Dim conn As New
OleDb.OleDbConnection("Provider=Microsoft.Jet.OLED B.4.0;" & _
" Data Source=C:\Test1\db3.mdb;User Id=admin;Password=;")
Dim cmd As New OleDb.OleDbCommand("CREATE TABLE Test ( " & _
"Gid uniqueidentifier, " & _
"NextN int, " & _
"CONSTRAINT [pk_Gid] PRIMARY KEY (Gid)) ", conn)
conn.Open()
cmdExecute(cmd)
cmd.CommandText = "INSERT INTO Test (Gid, NextN) VALUES (?, ?)"
cmd.Parameters.Add _
(New OleDb.OleDbParameter("", OleDb.OleDbType.Guid))
cmd.Parameters.Add _
(New OleDb.OleDbParameter("", OleDb.OleDbType.Integer))
For i As Integer = 0 To 20000
cmd.Parameters(0).Value = Guid.NewGuid
cmd.Parameters(1).Value = i
cmdExecute(cmd)
Next
conn.Close()
End Sub
Private Sub cmdExecute(ByVal cmd As OleDb.OleDbCommand)
Try
cmd.ExecuteNonQuery()
Catch ex As OleDb.OleDbException
MessageBox.Show(ex.Message, "OleDbException")
Exit Sub
Catch ex As Exception
MessageBox.Show(ex.Message, "GeneralException")
Exit Sub
End Try
End Sub
End Class
///
I hope this helps a little bit?

Cor


Cor,在尝试你的代码时,我得到一个编译错误,你在那里将
比较消息框结果= DialogResult.Yes。编译错误是

对非共享成员的引用需要对象引用。

编译器正在抱怨DialogResult.Yes,因为它被强调为

是问题。


" Cor Ligthert写道:
Cor, when trying your code, I get a compile Error on the line where you
compare the messagebox result to = DialogResult.Yes. The Compile Error is
"Reference to a non-shared member requires an object reference". The
Compiler is complaining about the DialogResult.Yes as it''s underlined as
being the problem.

"Cor Ligthert" wrote:
S Shulman

我今天做了这个因为我对某些事情感到好奇,也许你可以使用
它。
<需要一个带有列表框的表单
Private Sub Form1_Load(ByVal sender As System.Object,_
ByVal e As System.EventArgs)处理MyBase.Load 将myreadDb调暗为新的readDatabase(myQ)
将MyThr调暗为新的System.Threading.Thread(AddressOf myreadDb.Read)
MyThr.Start()
Me.Show()
Do until myreadDb.ready AndAlso myQ.Count = 0
SyncLock myQ.SyncRoot
如果myQ.Count> 0然后
Me.ListBox1.Items.Add(myQ.Dequeue)
Me.ListBox1.SelectedIndex = ListBox1.Items.Count - 1
Me.ListBox1.Show()
结束如果
结束SyncLock
循环
结束子
结束类
公共类readDatabase
私人MyQ作为队列
朋友准备作为布尔
Public Sub New(ByVal pMyQ As Queue)
MyQ = pMyQ
End Sub
Friend Sub Read()
Dim fi As New IO.FileInfo(" c:\\ \\ test1 \db3.mdb")
如果不是fi.Exists然后
Dim db作为新CreateDB
结束如果
Dim conn As New
OleDb.OleDbConnection( " Provider = Microsoft.Jet.OLED B.4.0;"& _
" Data Source = C:\ Test1 \ db3.mdb; User
Id = admin; Password =; ")
Dim cmd As New OleDb.OleDbCommand(" select count(*)from T est" conn)
conn.Open()
Dim count As Integer = CInt(cmd.ExecuteScalar())
cmd.CommandText =" Select * from Test"
Dim drdr As OleDb.OleDbDataReader
drdr = cmd.ExecuteReader()
而drdr.Read()
SyncLock MyQ.SyncRoot
MyQ.Enqueue(drdr.GetInt32(1))
结束SyncLock
结束时
ready = True
drdr.Close()
conn.Close()
End Sub
End Class <朋友类CreateDB
Public Sub New()
Dim catNewDB As New ADOX.Catalog
Dim fi As New IO.FileInfo(" c:\ test1 \ db3.mdb" ;)
如果fi.Exists那么
如果MessageBox.Show(" Delete?",Existing File db3.mdb,_
MessageBoxButtons.YesNo)= DialogResult.Yes Then
fi.Delete()
其他
退出Sub
结束如果
结束如果catNewDB.Create(" Provider = Microsoft.Jet.OLEDB.4.0; " &安培; Data
Source = C:\ test1\db3.mdb)
Dim conn As New
OleDb.OleDbConnection(" Provider = Microsoft.Jet.OLED B.4.0; "& _
" Data Source = C:\ Test1 \ db3.mdb; User Id = admin; Password =;")
Dim cmd As New OleDb.OleDbCommand(" CREATE TABLE测试(& _
Gid uniqueidentifier,"& _
" NextN int,& _
" CONSTRAINT [pk_Gid] PRIMARY KEY( Gid))",conn)
conn.Open()
cmdExecute(cmd)
cmd.CommandText =" INSERT INTO Test(Gid,NextN)VALUES(?,?)" ;
cmd.Parameters.Add _
(新OleDb.OleDbParameter(",OleDb.OleDbType.Guid))
cmd.Parameters.Add _
(新OleDb .OleDbParameter(",OleDb.OleDbType.Integer))
我的整数= 0到20000
cmd.Para米(0).Value = Guid.NewGuid
cmd.Parameters(1).Value = i
cmdExecute(cmd)
下一页
conn.Close()
结束Sub
Private Sub cmdExecute(ByVal cmd As OleDb.OleDbCommand)
尝试
cmd.ExecuteNonQuery()
Catch ex As OleDb.OleDbException
MessageBox.Show(ex .Message,OleDbException)
退出Sub
Catch ex As Exception> MessageBox.Show(ex.Message," GeneralException")
Exit Sub
End试试
结束Sub
End Class
///
我希望这有点帮助吗?

Cor
S Shulman

I made this today because I was curious about someting, maybe can you use
it.

\\\Needs a form with a listbox on it
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim myQ As New Queue
Dim myreadDb As New readDatabase(myQ)
Dim MyThr As New System.Threading.Thread(AddressOf myreadDb.Read)
MyThr.Start()
Me.Show()
Do Until myreadDb.ready AndAlso myQ.Count = 0
SyncLock myQ.SyncRoot
If myQ.Count > 0 Then
Me.ListBox1.Items.Add(myQ.Dequeue)
Me.ListBox1.SelectedIndex = ListBox1.Items.Count - 1
Me.ListBox1.Show()
End If
End SyncLock
Loop
End Sub
End Class
Public Class readDatabase
Private MyQ As Queue
Friend ready As Boolean
Public Sub New(ByVal pMyQ As Queue)
MyQ = pMyQ
End Sub
Friend Sub Read()
Dim fi As New IO.FileInfo("c:\test1\db3.mdb")
If Not fi.Exists Then
Dim db As New CreateDB
End If
Dim conn As New
OleDb.OleDbConnection("Provider=Microsoft.Jet.OLED B.4.0;" & _
" Data Source=C:\Test1\db3.mdb;User
Id=admin;Password=;")
Dim cmd As New OleDb.OleDbCommand("select count(*) from Test", conn)
conn.Open()
Dim count As Integer = CInt(cmd.ExecuteScalar())
cmd.CommandText = "Select * from Test"
Dim drdr As OleDb.OleDbDataReader
drdr = cmd.ExecuteReader()
While drdr.Read()
SyncLock MyQ.SyncRoot
MyQ.Enqueue(drdr.GetInt32(1))
End SyncLock
End While
ready = True
drdr.Close()
conn.Close()
End Sub
End Class
Friend Class CreateDB
Public Sub New()
Dim catNewDB As New ADOX.Catalog
Dim fi As New IO.FileInfo("c:\test1\db3.mdb")
If fi.Exists Then
If MessageBox.Show("Delete?", "Existing File db3.mdb", _
MessageBoxButtons.YesNo) = DialogResult.Yes Then
fi.Delete()
Else
Exit Sub
End If
End If
catNewDB.Create("Provider=Microsoft.Jet.OLEDB.4.0; " & "Data
Source=C:\test1\db3.mdb")
Dim conn As New
OleDb.OleDbConnection("Provider=Microsoft.Jet.OLED B.4.0;" & _
" Data Source=C:\Test1\db3.mdb;User Id=admin;Password=;")
Dim cmd As New OleDb.OleDbCommand("CREATE TABLE Test ( " & _
"Gid uniqueidentifier, " & _
"NextN int, " & _
"CONSTRAINT [pk_Gid] PRIMARY KEY (Gid)) ", conn)
conn.Open()
cmdExecute(cmd)
cmd.CommandText = "INSERT INTO Test (Gid, NextN) VALUES (?, ?)"
cmd.Parameters.Add _
(New OleDb.OleDbParameter("", OleDb.OleDbType.Guid))
cmd.Parameters.Add _
(New OleDb.OleDbParameter("", OleDb.OleDbType.Integer))
For i As Integer = 0 To 20000
cmd.Parameters(0).Value = Guid.NewGuid
cmd.Parameters(1).Value = i
cmdExecute(cmd)
Next
conn.Close()
End Sub
Private Sub cmdExecute(ByVal cmd As OleDb.OleDbCommand)
Try
cmd.ExecuteNonQuery()
Catch ex As OleDb.OleDbException
MessageBox.Show(ex.Message, "OleDbException")
Exit Sub
Catch ex As Exception
MessageBox.Show(ex.Message, "GeneralException")
Exit Sub
End Try
End Sub
End Class
///
I hope this helps a little bit?

Cor



Dennis,


我忘了写它需要引用COM的引用

adox ext 2.x for dll and security

但是我不能强迫你有错误。


也许有pa有时会发生错误。


Cor
Dennis,

I forgot to write as well that it needs a reference to a reference to COM
adox ext 2.x for dll and security
However I cannot force the error you have.

Maybe is there with pasting an _ gone wrong that happens sometimes.

Cor


这篇关于调用方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆