C# 正在从任务调用Messagebox.Show

C# 正在从任务调用Messagebox.Show,c#,task-parallel-library,C#,Task Parallel Library,我刚刚在我们的代码库中找到了这个宝石。我想我已经知道这个问题的答案了:我很确定在后台线程中调用MessageBox.Show是个糟糕的主意,但是有人能帮我确认和澄清一下吗 private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { if (_FileScanner.IsSending) { Trace("Cannot close form because: Transferr

我刚刚在我们的代码库中找到了这个宝石。我想我已经知道这个问题的答案了:我很确定在后台线程中调用MessageBox.Show是个糟糕的主意,但是有人能帮我确认和澄清一下吗

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (_FileScanner.IsSending)
    {
        Trace("Cannot close form because: Transferring files.");
        e.Cancel = true;
        Task<DialogResult> t = Task.Factory.StartNew(() => MessageBox.Show("Transferring files"));
        return;
    }
}
private void main form\u FormClosing(对象发送方,FormClosingEventArgs e)
{
if(_FileScanner.IsSending)
{
跟踪(“无法关闭窗体,因为:正在传输文件”);
e、 取消=真;
Task t=Task.Factory.StartNew(()=>MessageBox.Show(“传输文件”));
返回;
}
}

这样做似乎没有什么意义,事实上存在潜在的危险-考虑到繁重的工作实际上是在非UI阻塞线程上使用任务(应该是这样)处理的,那么就在您希望表单阻塞输入的时候(取决于需求,但不管对话框模式如何,这仍然有效)直到确认时,您才可以在STAThread上执行此操作。

是的,据我所知,您应该只从UI线程调用UI,否则您可能会得到从异常到意外结果的任何结果:)我想知道这段代码背后的原因是什么…;)我不完全确定,但TaskScheduler实际上可能会安排任务使用UI同步上下文,代码可能会在UI线程上执行。确切地说:这里的问题是所有繁重的工作都是在UI线程上完成的(因此会阻塞),我们的“高级”开发人员的解决方案是将MessageBox.Show调用推送到后台线程。