这就是我想要实现的目标
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.