有没有办法“告诉”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
评论:
QuickTestApplication
)是COM对象具有Run和Pause的方法(如上面的代码中所述)。QuickTestApplication
是一个黑盒子Thread
或ASync
(基本上是线程),但QuickTestApplication
构建方法如果可以使用C#
完成,我真的想找到简单的答案答案 0 :(得分: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方法检索异步调用的结果。
答案 1 :(得分:2)
您可以使用“任务”,然后运行该方法。我还没有使用过这些,但我相信这是他们在C#中的目的。
来自MSDN(http://msdn.microsoft.com/en-us/library/dd537609.aspx):
“任务表示异步操作,在某些方面它类似于新线程或ThreadPool工作项的创建,但处于更高的抽象级别。任务提供两个主要好处:
更有效,更可扩展地使用系统资源。
在幕后,任务排队到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.
*/
答案 2 :(得分:1)
QTP自动化允许异步运行测试,请查看文档:
因此,您不必像在示例中那样运行Run
属性(而不是QTP应用程序)上的普通Test
,而是必须提供默认结果选项,然后指定False
WaitOnReturn
Set resOpt = CreateObject("QuickTest.RunResultsOptions")
qtApp.Test.Run resOpt, False