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. 我不想使用Threador 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):

“一个任务代表一个异步操作,在某些方面它类似于创建一个新线程或线程池工作项,但在更高的抽象级别。任务提供两个主要好处:

更高效、更可扩展地使用系统资源。

在幕后,任务排队到线程池,该线程池已通过算法(如爬山)进行了增强,该算法可确定并调整线程数以最大限度地提高吞吐量。这使得任务相对轻量级,您可以创建许多任务以启用细粒度并行性。为了补充这一点,采用了广为人知的工作窃取算法来提供负载平衡。

比线程或工作项更多的编程控制。

任务和围绕它们构建的框架提供了一组丰富的 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然后指定TestFalseWaitOnReturn

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