2012-04-24 92 views
1

有沒有辦法「告訴」C#不要等待對象的方法返回?不想等待方法返回

使用COM(VbScript)我可以在不等待它返回的情況下觸發一個方法,所以我想以相同的方式使用C#。

VBScript代碼:

Dim qtApp 
Set qtApp = CreateObject("QuickTest.Application") 
qtApp.Open("C:\Temp\Test") 

qtApp.Run '// VbScript does not wait for this method to finish 

Set qtApp = Nothing 

C#代碼:

//Refer the object 
var qtApp = new QuickTest.Application(); 
//Open the test 
qtApp.Open("C:\\Temp\\Test"); 

qtApp.Test.Run(); //<<== @ this step my code is waiting for the Run method to return 
qtApp.Test.Pause(); //<<== This line is never executed until Run returns 

評論:

  1. 對象引用(QuickTestApplication)是COM對象具有用於運行和方法暫停(如上面的代碼所述)。
  2. 對我來說QuickTestApplication是一個黑盒子
  3. 我不想使用ThreadASync(這基本上是線程),但QuickTestApplication構建的方法

我真的很簡單的答案,如果它可以用C#完成

+0

運行在一個單獨的線程的方法?你能否提供更多細節? – Tudor 2012-04-24 19:55:07

+2

有問題的COM對象是否與當前線程關聯?請記住,COM對象通常是單線程單元模型。 – 2012-04-24 19:58:48

+0

@EricLippert:我的應用程序不是單線程的,我想使用它的方法。感謝您的評論 – 2012-04-24 21:38:29

回答

1

的QTP自動化允許異步地運行測試,看文檔:

Documentation for Run method

所以不是運行平原Run的(在Test屬性不是QTP應用程序,就像你的樣品中沒有),你必須提供一個默認的結果選項,然後指定FalseWaitOnReturn

Set resOpt = CreateObject("QuickTest.RunResultsOptions") 
qtApp.Test.Run resOpt, False 
+0

謝謝你的回覆。我會在星期天第一件事看到並通知這個帖子。 – 2012-04-26 18:59:42

+0

它爲這個問題做了竅門。謝謝。 – 2012-04-29 07:42:20

3

異步執行。

http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx
http://msdn.microsoft.com/en-us/magazine/cc301332.aspx

.NET框架使您能夠異步調用的任何方法。若要 做到這一點,您可以定義一個與您要調用的方法 具有相同簽名的委託;公共語言運行庫爲此代理自動定義 BeginInvoke和EndInvoke方法,並使用 適當的簽名。

BeginInvoke方法啓動異步調用。 EndInvoke方法檢索異步調用的結果。

+1

異步不是我正在尋找的東西,因爲我稱之爲 - 我不想等待返回。異步是一個旁路。 – 2012-04-24 20:08:43

2

您可能可以使用「任務」,並在其中運行該方法。我還沒有使用過這些,但我相信這是他們在C#中的目的。

從MSDN(http://msdn.microsoft.com/en-us/library/dd537609.aspx):

「任務表示異步操作,而且在某些方面,它類似於一個創作新的線程或線程池工作項目,但在更高的抽象水平的任務提供兩個主要好處:

更高效,更可擴展的系統資源的使用

在後臺,任務排隊到線程池,這已經通過算法(如爬山)得到了增強,這些算法決定並調整最大化t的線程數hroughput。這使得任務相對輕量級,並且可以創建其中的很多任務來啓用細粒度的並行。爲了補充這一點,採用了廣爲人知的工作竊取算法來提供負載平衡。

更多的線程或工作項目可能的編程控制。

任務,並圍繞他們所建立的框架,提供了一套豐富的,支持的API等待,取消,延續,健壯的異常處理,詳細狀態,自定義調度,和更多的。

由於這兩個原因,在.NET Framework 4,任務是用於寫入多線程,異步和並行代碼的首選API。」

// Create a task and supply a user delegate by using a lambda expression. 
var taskA = new Task(() => Console.WriteLine("Hello from taskA.")); 

// Start the task. 
taskA.Start(); 

// Output a message from the joining thread. 
Console.WriteLine("Hello from the calling thread."); 


/* Output: 
* Hello from the joining thread. 
* Hello from taskA. 
*/ 
+1

使用任務基本上依賴於線程,而我想使用該對象的接口。 – 2012-04-24 21:40:52