1

これは私が達成しようとしているものです

  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 ステートメントに入れる方法がわかりません。Plsは、以下のようなことを達成できるより良い方法で助けていただければ幸いです。

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

3 に答える 3

2

別のバリエーション....これは醜いです:

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);
    }
}
于 2013-11-11T03:53:04.657 に答える
2

Invoke()ではなく、メソッドが必要なようですBeginInvoke()

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

BeginInvokeはデリゲートを非同期で実行します。つまり、結果は を呼び出すスレッドですぐには利用できませんBeginInvoke

于 2013-11-11T03:50:52.217 に答える
1

あなた (およびあなたの仲間のコーダー) の生活を楽にして、次のようなことをしてみませんか?

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.
于 2013-11-11T03:48:58.937 に答える