只有赋值、调用、递增、递减和新对象表达式可以用作语句:消息框



这就是我想要实现的目标

  if( this.BeginInvoke((Action)(
        () => MessageBox.Show("Test", 
                              MessageBoxButtons.YesNo) == DialogResult.No)))

上面给出了错误。我尝试将委托与外部方法分开,例如

delegate void test(string text);
private void SetTest(string text)
{
 if(MessageBox.Show(text,"", MessageBoxButtons.YesNo) == DialogResult.No)
}

但它违反了我需要代表的原因。我发现了第一个适合我的作品,但我不知道如何将其放在 if/else 语句中。请以更好的方式提供任何帮助,我可以实现以下一些事情,我们将不胜感激。

  if(this.BeginInvoke((Action)(
      () => MessageBox.Show("Test", 
                            MessageBoxButtons.YesNo) == DialogResult.No)))

另一种变体....伙计,这很丑陋:

if ((bool)this.Invoke((Func<bool>)delegate
  {
  return MessageBox.Show("Test Message", 
                         "Test Title", 
                         MessageBoxButtons.YesNo) == DialogResult.No;
  }))
{
    Console.WriteLine("No was indeed selected.");
}

这应该适用于任何版本的 C#:

private void button1_Click(object sender, EventArgs e)
{
    System.Threading.Thread T = new System.Threading.Thread(Foo);
    T.Start();
}
delegate bool SetTestDelegate(string text);
private bool SetTest(string text)
{
    return (MessageBox.Show(text, "", MessageBoxButtons.YesNo) == DialogResult.No);
}
private void Foo()
{
    if ((bool)this.Invoke(new SetTestDelegate(SetTest), new object[] {"test"}))
    {
        Console.WriteLine("No was indeed selected.");
    }
}

编辑:您可以将该代码重构为更有用的代码...

private void button1_Click(object sender, EventArgs e)
{
    System.Threading.Thread T = new System.Threading.Thread(Foo);
    T.Start();
}
private void Foo()
{
    if (Response("test") == System.Windows.Forms.DialogResult.No)
    {
        Console.WriteLine("No was indeed selected.");
    }
}
delegate DialogResult ResponseDelegate(string text);
private DialogResult Response(string text)
{
    if (this.InvokeRequired)
    {
        return (DialogResult)this.Invoke(new ResponseDelegate(Response), new object[] { "test" });
    }
    else
    {
        return MessageBox.Show(text, "", MessageBoxButtons.YesNo);
    }
}

似乎您需要一种Invoke()方法,而不是BeginInvoke()

var messageBoxResult = (DialogResult)Invoke(new Func<DialogResult>(
    () => MessageBox.Show("Test", "Test", MessageBoxButtons.YesNo)));
if(messageBoxResult == DialogResult.No)
{
}

BeginInvoke异步执行委托,这意味着结果不会立即在调用 BeginInvoke 的线程上可用。

为什么不让你(和你的程序员同事)的生活更轻松,做一些事情:

var user_said_no = this.BeginInvoke((Action)(
   () => MessageBox.Show("Test", MessageBoxButtons.YesNo) == DialogResult.No));

然后有:

if (user_said_no)
   cancel_nuclear_attack() ; // Or whichever things you need to do.

最新更新