2012-12-16 49 views
0

我很困惑。是的,我明白我不能使用同一個背景工作者同時完成兩項任務。我不明白的是這個。這裏是我的代碼(這一切事都設置一個進度條的marqueeanimationspeed ...這個BackgroundWorker目前很忙,不能同時運行多個任務

'THE FOLLOWING SUB TOGGLES THE PROGRESS BAR 
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 

    'CHECK THE STATE OF THE PROGRESS BAR AND TOGGLE IT 
    If ToolStripProgressBar1.MarqueeAnimationSpeed = 0 Then 

     ToolStripProgressBar1.MarqueeAnimationSpeed = 22 

    End If 

    ToolStripProgressBar1.MarqueeAnimationSpeed = 0 


End Sub 

好了,多長時間能這樣可能把?不工人做任務和退出?所以我暫停(system.threading.thread.sleep(2000)...同樣的問題,使它20秒...同樣的問題。

所以我認爲這是一個簡單的東西,我失蹤了,但我花了超過一個小時的搜索,我沒有得到它

所有我想在這裏完成的是在用戶界面運行別的東西時啓動選框進度條,然後停止它。我可以創建另一個背景工作者並使用它,但我想了解爲什麼第一個工作沒有完成任務。

謝謝,再說一次,是的,我花了一個小時尋找,我找到各種「解決方案」,但沒有解釋爲什麼這件事沒有完成。

OK所以這裏是子調用BGW

'THE FOLLOWING SUB FIRES THE SETTING CONNECTION STRINGS SUB 
Private Sub SetCSButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SetCSButton.Click 

    'START THE PROGRESS BAR & CHANGE THE LABEL 
    BackgroundWorker1.RunWorkerAsync() 
    Threading.Thread.Sleep(1000) 
    ToolStripStatusLabel1.Text = "Preparing the connection strings..." 
    Me.Refresh() 


    thread3 = New System.Threading.Thread(AddressOf SetConnectionStrings) 
    thread3.Start() 

    'STOP THE PROGRESS BAR & CHANGE THE LABEL 
    BackgroundWorker2.RunWorkerAsync() 
    Threading.Thread.Sleep(1000) 
    ToolStripStatusLabel1.Text = "Standing by..." 
    Me.Refresh() 

End Sub**strong text** 

我有一個20秒延遲,但仍是第一BGW沒有完成。我知道這很簡單,但我不明白,這就是我在這之後的全部。

我DID改變了代碼,不使用相同的方法,因爲我在寫這個問題的時候正在嘗試......我不明白爲什麼一個簡單的操作從來沒有,顯然,完成...有說,它完成了,因爲我能夠使用runworkercompleted事件顯示msgbox。所以,當我嘗試並且沒有傳達時,這些並不是關於編碼的正確或錯誤的方式,我知道它錯了,只是試圖快速和骯髒,不管如何,我現在沒有這樣做,但我不明白爲什麼BGW「仍在工作」。一定有一些我不知道的簡單的事情。

感謝

+0

編輯之後:並不是很清楚,因爲現在Bg2和Thread3進入了遊戲。但是,當Bgw1和Bgw2以某種方式引用相同的實例時,它有意義,Thread.Sleep()綁定了消息循環,因此Completed事件不能被處理。 –

回答

1

的錯誤不是在發佈代碼,但你開始對BGW。

但它是所有無關的,因爲你不應該從DoWork的觸摸界面:

Private Sub BackgroundWorker1_DoWork(...) Handles BackgroundWorker1.DoWork 

    'CHECK THE STATE OF THE PROGRESS BAR AND TOGGLE IT 
    If ToolStripProgressBar1.MarqueeAnimationSpeed = 0 Then ' Boom, cross-threading violation 

     ToolStripProgressBar1.MarqueeAnimationSpeed = 22 

    End If 

我不認爲你需要一個BGW,螺紋或定時器在這裏。只需在慢動作之前/之後改變速度。

+0

這是一個簡單的應用程序,所以,而不是與委託混亂,我忽略了跨線程調用...可能不是「正確」我知道,但我是唯一的開發人員,我知道沒有其他行爲。另外,我所遇到的困惑是bgw沒有完成的原因,它幾乎沒有任何結果。我嘗試了延遲等,我認爲這只是我能夠快速到達bgw真的沒有完成,但是在主線程中延遲了20秒,它必須做對嗎?這是我的困惑。 – jsteffler

+0

而且除非我錯過了一些東西,當然這很有可能......我試圖讓用戶知道應用程序沒有被凍結,發生的事情是DGv正在更新,我希望進度條掃過。如果我按照你的建議去做,而且我最初做的是,代碼更新字幕速度,在更新dgv時沒有任何反應,然後關閉,所以用戶在進度條上看不到任何事情。也許我在這裏感到困惑,或者做一些更基本的錯誤? – jsteffler

+1

只能使用Bgw來執行像加載數據那樣的非GUI內容。設置選框屬性是沒有用的。核心/標題問題仍然無法回答,因爲您沒有發佈相關代碼。 –