2014-02-13 39 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