0

抱歉,如果这是一个愚蠢的问题,我是 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;
        }
    }

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

4

1 回答 1

0

您想查看 Revit 中的异步处理模式 - 例如检查IExternalEvent 的 Building Coders 描述

可能需要一点时间来理解它,但让我尝试解释一下:

将您的代码分成两部分:第一部分一直运行到您要求用户选择快照的那一刻(我假设这发生在另一个应用程序中?)。在一个单独的线程中,在您的 while 循环中轮询剪贴板(或将您的应用程序注册为剪贴板查看器)。Sleep()投票时别忘了!一旦您的轮询线程找到图片,就创建一个IExternalEvent子类的实例并将其发布到 Revit。当 Revit 有空闲时间时,它会执行该Execute方法,并传入一个UIApplication您可以用来执行其余代码的方法。

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

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

于 2014-01-24T08:28:25.297 回答