2014-01-23 57 views
0

對不起,如果這是愚蠢的問題,我是C#的新手,所以請給我一個休息。停止一個沒有線程C的循環#

我正在使用Revit API。目前Revit API不支持多線程操作。 我的問題是如何在不調用新線程的情況下停止循環?

我正在特林得到一個快照,我waitting供用戶選擇一個快照,所以我把無窮遠環,直到該條件滿足

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

你可以使用'break'命令來打破while循環。 –

+1

你有沒有看看你的CPU負載'!Clipboard.ContainsImage()'這不是一個好主意! – TGlatzer

+4

永不** ** EVER **通過使用「while」循環等待操作完成 – RononDex

回答

0

您想查看Revit中的異步處理模式 - 例如查看The Building Coders description of IExternalEvent

這可能需要一些時間來環繞它你的頭,但讓我試着解釋:

拆分代碼分爲兩個部分:直到此刻你問用戶挑選的第一部分,運行起來一個快照(我假設這發生在另一個應用程序?)。在單獨的線程中,輪詢while循環中的剪貼板(或register your application as a clipboard viewer)。在投票時別忘了Sleep()!只要您的輪詢線程找到圖片,請創建IExternalEvent子類的實例並將其發佈到Revit。當Revit有一些空閒時間時,它將執行Execute方法,並傳入一個UIApplication,您可以使用該方法執行其餘代碼。

的Revit不會讓你訪問它是從在同一時間多個線程API,而是一個IExternalEvent子類的Execute方法的過程中,你都保證在運行的代碼正確的線程。

您還可以查看OnIdling事件 - 基本上,每次Revit都有一些空閒時間時會調用它。因此,您不必在單獨的線程中使用while循環,而只需將剪貼板檢查代碼放入事件處理函數中,並創建一個機制(標誌),告訴您是否正在等待快照。 ..