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オブジェクトであり、RunおよびPauseのメソッドがあります(上記のコードで説明されています)。
  2. 私にとってQuickTestApplicationはブラックボックスです
  3. ThreadまたはASync(基本的にスレッド化)を使用したくないが、QuickTestApplication組み込みメソッド

C#を使用して実行できるのであれば、私は本当に簡単な答えを探しています

4

3 に答える 3

3

非同期で実行します。

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

.NET Frameworkを使用すると、任意のメソッドを非同期で呼び出すことができます。これを行うには、呼び出したいメソッドと同じシグニチャを持つデリゲートを定義します。共通言語ランタイムは、適切な署名を使用して、このデリゲートのBeginInvokeメソッドとEndInvokeメソッドを自動的に定義します。

BeginInvokeメソッドは、非同期呼び出しを開始します。EndInvokeメソッドは、非同期呼び出しの結果を取得します。

于 2012-04-24T19:54:37.990 に答える
2

「タスク」を使用して、その中でメソッドを実行できる場合があります。私はまだこれらを使用していませんが、それがC#での目的であると思います。

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

「タスクは非同期操作を表し、いくつかの点で新しいスレッドまたはThreadPool作業項目の作成に似ていますが、より高いレベルの抽象化があります。タスクには2つの主な利点があります。

システムリソースのより効率的でスケーラブルな使用。

舞台裏では、タスクはThreadPoolにキューイングされます。これは、スループットを最大化するスレッドの数を決定および調整するアルゴリズム(山登り法など)で拡張されています。これにより、タスクが比較的軽量になり、それらの多くを作成して、きめ細かい並列処理を可能にすることができます。これを補完するために、広く知られているワークスティーリングアルゴリズムを使用して負荷分散を提供します。

スレッドまたは作業項目で可能であるよりも多くのプログラムによる制御。

タスクとその周りに構築されたフレームワークは、待機、キャンセル、継続、堅牢な例外処理、詳細なステータス、カスタムスケジューリングなどをサポートする豊富な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. 
*/
于 2012-04-24T19:58:50.653 に答える
1

QTP自動化により、テストを非同期で実行できます。ドキュメントを参照してください。

Runメソッドのドキュメント

したがって、RunTestサンプルで行ったようにQTPアプリケーションではなくプロパティで)プレーンを実行する代わりに、デフォルトの結果オプションを提供してからFalseWaitOnReturn

Set resOpt = CreateObject("QuickTest.RunResultsOptions")
qtApp.Test.Run resOpt, False
于 2012-04-25T06:44:19.373 に答える