我想在使用Task.WaitAll()
等待一些任務時完全阻塞UI。如果最終用戶與應用程序主窗體交互,則在等待時調用form1.OnPaint()
。我們正在使用Winforms平臺。Task.WaitAll()讓一些WM_PAINT消息被處理
這怎麼能實現呢?
我想在使用Task.WaitAll()
等待一些任務時完全阻塞UI。如果最終用戶與應用程序主窗體交互,則在等待時調用form1.OnPaint()
。我們正在使用Winforms平臺。Task.WaitAll()讓一些WM_PAINT消息被處理
這怎麼能實現呢?
處理這個問題的方法是手動禁用UI。
如果您使用winforms,最簡單的方法是將Form.Enabled
設置爲false,然後在完成等待任務完成後再重新啓用它。
如果你有機會到異步/等待這將是這麼簡單
public async Task DisableFormsTillTasksComplete(Task[] tasks)
{
this.Enabled = false;
await task.WhenAll(tasks);
this.Enabled = true;
}
如果您不能使用異步/等着你可能需要運行在後臺線程的Task.WaitAll
讓你不阻止繪畫事件。
對不起史葛,我想阻止繪畫事件。你最後一句話有沒有錯別字? – abenci
我想我不明白你的問題。你能否請你更新你的問題,並給出你想要阻止什麼和你想要通過什麼的更詳細的解釋。我的答案允許所有UI繪畫仍然發生,但禁用該程序,以便用戶無法與其交互。這是大多數人通常想要「阻止用戶界面」時所要做的。如果那不是你想要的,你需要在你的問題中更加詳細,因爲大多數人會假設和我一樣。 –
@Alberto聽起來好像你的'OnPaint'寫得非常糟糕。如果你在後臺緩衝區中繪製(如果需要的話),並且總是從OnPaint中的後臺緩衝區中繪製,可能會更好?這樣,您的應用程序仍然可以響應,而不會在'OnPaint'中做任何重要的工作。 – Luaan
我很好奇。你是否在UI線程上調用Task.WaitAll()?如果是這樣,哪個線程用於'form1.OnPain()'方法? – Dirk
您是使用winforms還是WPF? –
'我想完全阻止UI'爲什麼?這正是用戶界面不應該做的。 –