【问题标题】:How to call multiple WCF methods in sequence without blocking the UI thread?如何在不阻塞 UI 线程的情况下依次调用多个 WCF 方法?
【发布时间】:2012-12-11 16:54:31
【问题描述】:

我必须在不阻塞 UI 线程的情况下依次调用多个 WCF 方法。

每个方法都必须在调用下一个方法之前完成。

我已经使用 svcutil 设置了我的 WCF 服务,因此我有一个可用的同步方法的异步版本。

如果我调用异步版本,这些方法将同时执行,这是我想要避免的。

如果我调用同步版本,UI 线程被阻塞,所以我的 UI 没有响应,这是我想要避免的。

如何调用异步版本并在下一次调用之前等待每次调用完成,而不阻塞 UI 线程?

假设我必须循环每次出现的要由 WCF 方法处理的对象:

foreach (MyObject obj in SomeCollection)
{
    myWCFProxy.TreatObject(obj); // This is a duplex service and I am handling its callback in a separate method.
    // I would like to wait here (without blocking the UI thread) until the method returns.
}

我该怎么做?

【问题讨论】:

  • 你实现了基于任务的异步模式吗?如果是这样,请为每个异步调用使用await
  • @mikez 我正在使用 .NET Framework 4.0。

标签: c# wcf asynchronous synchronization


【解决方案1】:

难道不能将一系列同步 WCF 调用封装在一个异步方法中吗?这可以防止代码在您的 UI 线程上执行,而是以线性方式执行您的 WCF 调用。

另一种选择是在前一个 WCF 方法的回调中调用后续 WCF 方法。

【讨论】:

  • 很抱歉无法更早地编辑我的问题……看看我的 foreach 代码示例。将方法调用包装到异步方法将在异步方法完成之前开始下一次迭代。我想避免这种情况。
【解决方案2】:

根据您的描述,最简单的解决方案可能是使用BackgroundWorker 同步执行 WCF 调用。

【讨论】:

  • 我应该早点编辑我的问题。我已经尝试过了,但在 foreach 中,使用 BackgroundWorker 不会等到下一次迭代。
  • 把整个foreach放到BackgroundWorker中
  • @cadrell0: facepalm ...是的...你说得对!通过同步调用所有方法并将所有内容放在同一个 DoWork 事件处理程序中,它运行良好。谢谢。
【解决方案3】:

如果可以选择,我建议修改 WCF 服务以一次获取多个 MyObjects 并根据需要处理它们。那么你在客户端的代码就变成了:

myWCFProxy.TreatObjects(SomeCollection); //be sure to handle the callback

在 WCF 方面:

foreach (var obj in SomeCollection)
    TreatObject(obj); //it's synchronous, so it waits!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多