抱歉,如果这是一个愚蠢的问题,我是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;
}
}
但这种方法需要线程......任何建议!!
答案 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
循环,并创建一个机制(标志)来告诉您目前正在等待快照......