2017-09-09 19 views
0

我有以下代碼:如何在調用長時間運行的進程之前更新視圖模型上的屬性?

Public Sub ExecuteMyCommand 
    ShowProgressBar=True 
    CallLongRunningProcess 
    ShowProgressBar=False 
End Sub 

要獲取進度在長期運行過程之前,實際上顯示的UI啓動此代碼必須被改寫爲:

Public Async Sub ExecuteMyCommand 
    ShowProgressBar=True 
    Await Task.Run(Sub() CallLongRunningProcess) 
    ShowProgressBar=False 
End Sub 

現在的問題:

在某些方法中,長時間運行的過程涉及到創建WPF UserControls。這些必須在STA線程上創建。我發現如何做到這一點,但後來我得到一個InvalidOperationException,因爲用戶控件是非UI線程所擁有的。所以,我正在尋找一種方法來在UI線程上調用長時間運行的進程之前更新ShowProgressBar屬性(是的,醜陋的,我知道)。

+0

這是什麼意思'所以,我正在尋找一種方法來更新ShowProgressBar屬性,然後再調用UI線程上的長時間運行的進程「,這只是一個布爾,更新意味着什麼? – Sybren

+1

@Sybren ShowProgressBar屬性在視圖中綁定到ProgressBar.Visibility屬性。對不起,如果不明確。 – Dabblernl

回答

0

你試過Dispatcher.Invoke嗎?它將任務保留在UI線程上。 當然,您必須將ShowProgressBar=False移入代表。

Public Sub ExecuteMyCommand 
    ShowProgressBar=True 
    Me.Dispatcher.Invoke(DispatcherPriority.Normal, New LongRunningProcessDelegate()) 
End Sub 

我還單獨UI從所述計算任務修改邏輯,即,任務應該調用返回到UI線程時,其完成的,和UI元素的修改將留給回調。

+0

當我在異步數據庫查詢完成後必須刷新UI時,它對我很好,我想知道你的情況有什麼不同。儘管我在做C#。當然,大量的計算是由後臺工作人員完成的。我永遠不會在UI線程上施加負擔。 – yacc

+1

我的歉意。你的解決方案對我有用。我之前一定做得有點不同。 – Dabblernl

相關問題