3

API 不正式支持线程(见下文)或关闭活动文档的方法。也就是说,关闭活动文档的解决方法是调用...

SendKeys.SendWait("^{F4}");

...来自一个单独的线程。这很好用,除了我需要循环打开和关闭几个文档。如果我在线程之后放置任何代码,它将在关闭前一个文档之前运行它。我尝试了许多标准线程回调方法,包括...

Task.Factory.StartNew(() =>

ThreadPool.QueueUserWorkItem(new WaitCallback

AutoResetEvent.WaitOne()

没有运气。Thread.Sleep() 只是停止错误/崩溃。有没有人有任何想法。

“Revit 的内部仅在少数选定的隔离位置使用多处理。这些位置目前都不包含 Revit API 中的代码或其任何部分。因此 Autodesk 不建议从同时执行的内部对 Revit API 进行任何调用并行线程。可能是 Revit API 的某些部分足够隔离,以便能够在测试环境中从此类线程代码中成功执行;这不应被视为保证相同的源代码适用于任何模型或情况,或者 Revit 中的未来更改不会导致此代码停止运行。”

    public void OpenFile()
    {
        for (int i = 0; i < 3; i++)
        {
            uiApp.OpenAndActivateDocument(TargetPath(i));

            ThreadPool.QueueUserWorkItem(CloseDocProc);

            //any code here at all opens the next doc without closing the last
        }            
    }

    public void CloseDocProc(object stateInfo)
    {
        SendKeys.SendWait("^{F4}");

        //can run code here
    }
4

3 回答 3

1

就像他们说的那样,问题出在线程上。使用任何回调方法,它都会在此时冻结。而且你只能在线程中做有限的事情,它不会让我打开一个文件,无论如何!

答案是使用单线程计时器。

System.Windows.Forms.Timer;

每 10 秒左右调用一次我的 Open() 方法,并在计数器达到某个点时停止计时器并运行最后一位代码。

于 2012-08-21T20:18:08.693 回答
1

不确定它是否可以解决问题,但您也许可以使用这种技术:http ://adndevblog.typepad.com/autocad/2012/06/use-thread-for-background-processing.html

它适用于 AutoCAD,但我认为它可以与 Revit 一起使用。Revit API 和 AutoCAD 一样,不支持多线程。您应该只从主线程调用 API 函数。

如果事实,您需要将调用编组到主线程。实现这一点的最简单方法是在主线程上创建一个 System.Windows.Forms.Control 对象,并从您要关闭文档的单独线程调用其 Invoke()。

或者您也可以创造性地使用空闲事件...

于 2012-08-23T15:20:29.477 回答
0

在您的应用空闲事件处理程序中创建一个与您的线程交互并处理 revit 调用的状态机。

于 2013-12-24T15:31:37.553 回答