我有Action2
无论何时自主调用都很有效,例如从菜单项,但此操作显示从Action1
调用时出现的奇怪错误。
如何Action2
以Action1
不会叠加Action1
的方式从Action2
发起Timer
的发布?
我目前的解决方案是使用Timer handoverToAction2 = new Timer();
void Action1()
{
DoWhateverNeeded();
handoverToAction2.Start();
}
void handoverToAction2_Tick(Object sender, EventArgs e)
{
handoverToAction2.Stop();
Action2();
}
控件。
有更优雅的解决方案吗?
{{1}}
答案 0 :(得分:1)
你可以尝试调用主线程让Action2
在那里运行。这是WinForm中的一个示例,其中Action1
调用主线程来调用Action2
。当我在调试器中检查堆栈跟踪时,看起来Action2
不在Action1
的调用堆栈中。
private void button1_Click(object sender, EventArgs e)
{
Action action2 = () => Console.WriteLine("Action 2");
Action action1 = () =>
{
Console.WriteLine("Action1");
BeginInvoke((MethodInvoker)delegate
{
action2();
});
};
action1();
}
答案 1 :(得分:0)
您需要的是在另一个线程上启动action2。一种保证的方法,它可以创建一个Thread实例,并使用ThreadStartDelegate调用该操作。但是,如果这不重要,并且您对并行执行这些操作更感兴趣,我建议使用TPL。 所以你只需要这样做: 任务action2Task = Task.Factory.StartNew(action2);
希望这有帮助!
澄清后的补充答案:
所以看起来你应该从Action2
通过调度程序来Action1
:
Dispatcher.BeginInvoke(action2);