在没有线程C#的情况下停止循环

时间:2014-01-23 08:47:07

标签: c# revit-api

抱歉,如果这是一个愚蠢的问题,我是C#的新手,所以请给我一个休息时间。

我正在研究Revit API。目前Revit API不支持多线程操作。 我的问题是如何在不调用新线程的情况下停止循环?

我想拍摄快照,我正在等待用户选择一个快照,所以我把无限循环直到条件满足

while (!Clipboard.ContainsImage()) //loop till user get a clipboard image
                {

                }

但如果我想中止这个怎么办? 我试过了

private void Abort_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Escape)
        {
            abort = true;
        }
    }

但这种方法需要线程......任何建议!!

1 个答案:

答案 0 :(得分:0)

您希望在Revit中查看异步处理模式 - 请检查实例The Building Coders description of IExternalEvent

可能需要一段时间才能绕过它,但让我试着解释一下:

将代码分成两部分:第一部分运行直到你要求用户选择快照(我假设这种情况发生在另一个应用程序中?)。在单独的线程中,轮询while循环中的剪贴板(或register your application as a clipboard viewer)。在您进行投票时不要忘记Sleep()!轮询线程找到图片后,立即创建IExternalEvent子类的实例并将其发布到Revit。当Revit有一些空余时间时,它将执行Execute方法,传入UIApplication,您可以使用它来执行其余代码。

Revit不允许您同时从多个线程访问它的API ,但在Execute子类的IExternalEvent方法中,您可以保证在运行代码的正确线程中。

您还可以查看OnIdling事件 - 基本上,每次Revit也有空闲时间调用此事件。因此,您可以将剪贴板检查代码放在while事件的事件处理程序中,而不是在单独的线程中使用OnIdling循环,并创建一个机制(标志)来告诉您目前正在等待快照......