在新创建的Dialog上调用Invquire

时间:2012-07-20 13:58:06

标签: c# .net winforms

我们的应用程序中有以下方法来显示对话框。从UI线程和非UI线程调用该方法。可以在messageDialog上调用InvokeRequired以确保对话框将显示在UI线程上吗?

public static DialogResult ShowMessageDialog(MessageInfo messageInfo,ButtonFlags flags,IconType iconId,HorizontalAlignment btnAlignment,bool topMost)
{
DialogResult retDialogResult = DialogResult.None;

MessageDialog messageDialog = new MessageDialog(messageInfo.GetLanguageBasedFieldValue(MessageInfoField.Message), iconId);
messageDialog.TopMost = topMost;

// Initialize the layout of Message Dialog.
messageDialog.Initialize();
retDialogResult = messageDialog.ShowDialog();

return retDialogResult;
}

1 个答案:

答案 0 :(得分:4)

不,InvokeRequired将永远不会返回true,因为MessageDialog是在您正在执行的线程上构造的。此外,InvokeRequired将始终返回false,直到创建控件的句柄,直到稍后才会发生(请参阅MSDN)。

要么确保始终从UI线程调用ShowMessageDialog,要么让ShowMessageDialog进入UI线程,例如存储ISynchronizeInvoke。我认为前者是一个更好的解决方案。