使用winforms,如何在Action1堆栈之外执行Action1发起的Action2?

时间:2015-02-10 21:00:14

标签: c# .net winforms

我有Action2无论何时自主调用都很有效,例如从菜单项,但此操作显示从Action1调用时出现的奇怪错误。

如何Action2Action1不会叠加Action1的方式从Action2发起Timer的发布?

我目前的解决方案是使用Timer handoverToAction2 = new Timer(); void Action1() { DoWhateverNeeded(); handoverToAction2.Start(); } void handoverToAction2_Tick(Object sender, EventArgs e) { handoverToAction2.Stop(); Action2(); } 控件。

有更优雅的解决方案吗?

{{1}}

2 个答案:

答案 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通过调度程序Action1Dispatcher.BeginInvoke(action2);