2014-02-13 83 views
0

我想在使用Task.WaitAll()等待一些任務時完全阻塞UI。如果最終用戶與應用程序主窗體交互,則在等待時調用form1.OnPaint()。我們正在使用Winforms平臺。Task.WaitAll()讓一些WM_PAINT消息被處理

這怎麼能實現呢?

+0

我很好奇。你是否在UI線程上調用Task.WaitAll()?如果是這樣,哪個線程用於'form1.OnPain()'方法? – Dirk

+1

您是使用winforms還是WPF? –

+2

'我想完全阻止UI'爲什麼?這正是用戶界面不應該做的。 –

回答

2

處理這個問題的方法是手動禁用UI。

如果您使用winforms,最簡單的方法是將Form.Enabled設置爲false,然後在完成等待任務完成後再重新啓用它。

如果你有機會到異步/等待這將是這麼簡單

public async Task DisableFormsTillTasksComplete(Task[] tasks) 
{ 
    this.Enabled = false; 
    await task.WhenAll(tasks); 
    this.Enabled = true; 
} 

如果您不能使用異步/等着你可能需要運行在後臺線程的Task.WaitAll讓你不阻止繪畫事件。

+0

對不起史葛,我想阻止繪畫事件。你最後一句話有沒有錯別字? – abenci

+0

我想我不明白你的問題。你能否請你更新你的問題,並給出你想要阻止什麼和你想要通過什麼的更詳細的解釋。我的答案允許所有UI繪畫仍然發生,但禁用該程序,以便用戶無法與其交互。這是大多數人通常想要「阻止用戶界面」時所要做的。如果那不是你想要的,你需要在你的問題中更加詳細,因爲大多數人會假設和我一樣。 –

+0

@Alberto聽起來好像你的'OnPaint'寫得非常糟糕。如果你在後臺緩衝區中繪製(如果需要的話),並且總是從OnPaint中的後臺緩衝區中繪製,可能會更好?這樣,您的應用程序仍然可以響應,而不會在'OnPaint'中做任何重要的工作。 – Luaan