多線程操控同一個(gè)空間容易出現(xiàn)混亂,可通過(guò)SyncLock語(yǔ)句,將對(duì)空間的操作添加至lock語(yǔ)句內(nèi)部,
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、祿豐網(wǎng)絡(luò)推廣、成都小程序開(kāi)發(fā)、祿豐網(wǎng)絡(luò)營(yíng)銷、祿豐企業(yè)策劃、祿豐品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供祿豐建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com
Class?simpleMessageList
Public?messagesList()?As?String?=?New?String(50)?{}
Public?messagesLast?As?Integer?=?-1
Private?messagesLock?As?New?Object
Public?Sub?addAnotherMessage(ByVal?newMessage?As?String)
SyncLock?messagesLock
messagesLast?+=?1
If?messagesLast??messagesList.Length?Then
messagesList(messagesLast)?=?newMessage
End?If
End?SyncLock
End?Sub
End?Class
參考:
還是并發(fā)加鎖,你判斷時(shí)候,上一個(gè)線程還未執(zhí)行_datalist.RemoveAt(0),所0,然后就會(huì)出錯(cuò)了,你最好先 Remove到一個(gè)變量里,然后執(zhí)行發(fā)送,在Remove和判斷的時(shí)候加鎖
用time控件啊,獲取threadstate后,按指定時(shí)間間隔規(guī)定向界面刷新,線程必須是全局變量
用一個(gè)有退出條件的無(wú)限循環(huán)的sub也行。
線程開(kāi)始就觸發(fā)該過(guò)程,用無(wú)限循環(huán)來(lái)刷新?tīng)顟B(tài),線程完成即退出無(wú)限循環(huán)。局部變量的線程也可以用這種方式。
不過(guò)用法要正確,否則會(huì)出問(wèn)題。
這個(gè)沒(méi)法做到。原因
1)當(dāng)你將方法排入線程池隊(duì)列后,此方法在有線程池線程變得可用時(shí)執(zhí)行。
2)線程池中某個(gè)線程的可用與不可用,是由.net 后臺(tái)決定,用戶程序無(wú)法控制的
3)正如你觀察到的:線程啟動(dòng)的時(shí)間不同,有快有慢,這恰恰說(shuō)明線程池起作用了:線程池的調(diào)度試圖讓程序響應(yīng)達(dá)到最佳。
thread = New System.Threading.Thread(AddressOf DoStuff)thread.Start()Private Sub DoStuff() 'error occurs here' Me.Text = "Stuff"End Sub
方案1:
Private Sub DoStuff() Me.CheckForIllegalCrossThreadCalls = False Me.Text = "Stuff"End Sub
方案二thread = New System.Threading.Thread(AddressOf DoStuff)thread.Start()Private Delegate Sub DoStuffDelegate()Private Sub DoStuff() If Me.InvokeRequired Then Me.Invoke(New DoStuffDelegate(AddressOf DoStuff)) Else Me.Text = "Stuff" End IfEnd Sub
多線程一般是不推薦用的,因?yàn)榫€程之間如果有共享資源的話會(huì)引起競(jìng)爭(zhēng),需要加鎖處理;而且線程間沒(méi)有時(shí)序關(guān)系,所以你在調(diào)試中可能會(huì)出現(xiàn)異步處理結(jié)束順序與開(kāi)始處理順序不一致的情況(我在調(diào)試中已經(jīng)發(fā)現(xiàn)該問(wèn)題)。
針對(duì)你提出的這個(gè)問(wèn)題,采用了多線程處理,利用的是BackgroundWorker也就是異步處理控件進(jìn)行了處理。
代碼已經(jīng)經(jīng)過(guò)調(diào)試通過(guò)。歡迎交流,如有問(wèn)題,留下QQ或其他聯(lián)系方式。
代碼如下,并附程序截圖。
‘---------------------------------------------------
Imports?System.ComponentModel?'導(dǎo)入異步控件命名空間
Public?Class?Form1
Private?howmany?As?Integer?=?10
Private?AnalysisNumber(0?To?howmany?-?1)?As?BackgroundWorker
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
ListBox1.Items.Clear()
creatNewBackgroundWorker()
addHandle()
startWork()
End?Sub
Private?Sub?creatNewBackgroundWorker()
For?i?As?Integer?=?0?To?AnalysisNumber.Length?-?1
AnalysisNumber(i)?=?New?BackgroundWorker
Next
End?Sub
Private?Sub?addHandle()
For?i?As?Integer?=?0?To?AnalysisNumber.Length?-?1
AddHandler?AnalysisNumber(i).DoWork,?AddressOf?AnalysisNumber_DoWork
AddHandler?AnalysisNumber(i).RunWorkerCompleted,?AddressOf?AnalysisNumber_RunWorkerCompleted
Next
End?Sub
Private?Sub?startWork()
For?i?As?Integer?=?0?To?9
Dim?temp(0?To?9)?As?Integer
For?j?As?Integer?=?1?To?10
temp(j?-?1)?=?10?*?i?+?j
Next
AnalysisNumber(i).RunWorkerAsync(temp)
Next
End?Sub
Private?Sub?AnalysisNumber_DoWork(ByVal?sender?As?Object,?ByVal?e?As?System.ComponentModel.DoWorkEventArgs)
Dim?data?As?Integer()
data?=?CType(e.Argument,?Integer())
Dim?temp?As?Integer
For?i?As?Integer?=?0?To?data.Length?-?1
temp?=?data(i)
data(i)?=?temp?*?temp
Next
e.Result?=?data
End?Sub
Private?Sub?AnalysisNumber_RunWorkerCompleted(ByVal?sender?As?Object,?ByVal?e?As?System.ComponentModel.RunWorkerCompletedEventArgs)
Dim?data?As?Integer()
data?=?CType(e.Result,?Integer())
For?i?As?Integer?=?0?To?data.Length?-?1
ListBox1.Items.Add(data(i))
Next
End?Sub
End?Class