返回Ivoke消息DialogResult

时间:2015-03-25 13:03:14

标签: c# multithreading

全部。 我已经制作了一个通用的静态方法,可以通过其他形式使用。 现在我想返回那个消息框结果我怎么样?

我使用的代码为: -

public static DialogResult ShowMessage(Form Parent, string Text, string Caption, MessageBoxButtons Buttons, MessageBoxIcon Icon, MessageBoxDefaultButton DefaultButton)
    {
        if (Parent != null && Parent.InvokeRequired)
            return (DialogResult) Parent.Invoke((Action)(() => MessageBox.Show(Text, Caption, Buttons, Icon, DefaultButton)));
        else
            return (MessageBox.Show(Text, Caption, Buttons, Icon, DefaultButton));
    }

它使用简单的消息框抛出对象引用错误(例如,Ok消息)。 显示消息后显示空引用。

1 个答案:

答案 0 :(得分:2)

Action没有返回值,您应该使用Func代替:

return (DialogResult) Parent.Invoke(new Func<DialogResult>(() =>
 { return MessageBox.Show(Text, Caption, Buttons, Icon, DefaultButton); }));
顺便说一句,如果您不想重复两次相同的代码(MessageBox.Show(...)),可以通过以下方式使用代理:

delegate DialogResult MyInvoke(Form Parent, string Text, string Caption, MessageBoxButtons Buttons, MessageBoxIcon Icon, MessageBoxDefaultButton DefaultButton);

public static DialogResult ShowMessage(Form Parent, string Text, string Caption, MessageBoxButtons Buttons, MessageBoxIcon Icon, MessageBoxDefaultButton DefaultButton)
{
    if (Parent.InvokeRequired){
        return (DialogResult)Parent.Invoke(new MyInvoke(ShowMessage), Parent, Text, Caption, Buttons, Icon, DefaultButton);
    }
    return MessageBox.Show(Text, Caption, Buttons, Icon, DefaultButton);
}