【问题标题】:Don't want to wait for method to return不想等待方法返回
【发布时间】:2012-04-24 19:52:57
【问题描述】:

有没有办法“告诉”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. 我不想使用ThreadASync(这基本上是线程),但是QuickTestApplicationbuild in 方法

如果可以使用 C# 完成,我真的在寻找简单的答案

【问题讨论】:

  • 在单独的线程上运行该方法?能否请您提供更多详细信息?
  • 有问题的 COM 对象是否关联到当前线程?请记住,COM 对象通常是单线程单元模型。
  • @EricLippert:我的应用程序不是单线程的,我想使用它的方法。感谢您的评论
  • @Tudor:使用线程不是一种选择(设计问题)。感谢您的回复
  • @EricLippert QTP 自动化对象是一个 STA 对象。这个问题的答案是特定于应用程序,你在 C# 方面的专业知识是不够的 :)

标签: c# qtp


【解决方案1】:

异步执行。

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

.NET Framework 使您能够异步调用任何方法。到 这样做你定义了一个与方法具有相同签名的委托 你想打电话;公共语言运行时自动定义 此委托的 BeginInvoke 和 EndInvoke 方法,带有 适当的签名。

BeginInvoke 方法启动异步调用。 EndInvoke 方法检索异步调用的结果。

【讨论】:

  • 异步不是我想要的,正如我的标题 - 我不想等待返回。 async 是一种绕过方式。
【解决方案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. 
*/

【讨论】:

  • 使用Task基本上是靠线程,而我想使用对象的接口。
【解决方案3】:

QTP 自动化允许异步运行测试,查看文档:

因此,您必须提供默认结果选项,然后为 WaitOnReturn 指定 False,而不是运行普通的 Run(在 Test 属性上而不是 QTP 应用程序中)。

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

【讨论】:

  • 感谢您的回复。我会在周日第一时间检查并通知这篇文章。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多