0

在我的 winforms 客户端应用程序中,我为我的 WCF 服务(开始...和结束...)生成了异步方法。

当应用程序启动时,它对服务器进行异步调用以获取和缓存稍后将在应用程序中使用的数据(例如国家列表)。

如果应用程序的主线程在异步调用有机会完成之前需要这些数据(例如填充组合框),我想阻塞主线程直到异步调用结束。我想避免对 WCF 服务器进行冗余调用。

我曾尝试使用 Monitor/Mutex,Monitor.Enter(countryLock)然后BeginGetCountries在主线程中以及Monitor.Exit(countryLock)在调用该EndGetCountries方法时调用。但是,我面临以下异常:

对象同步方法是从未同步的代码块中调用的。

我应该调用调用Monitor.Exit(...)的同一个线程Monitor.Enter(...)吗?如果是,我如何知道Monitor对象的所有者并在其上下文中进行调用?

4

2 回答 2

0

就像 Peter Richie 所说,你不想锁定你的 UI 线程。真的,您只需要一个“忙碌”标志。

其次,尝试像您描述的那样使用 Monitor.Enter 执行此操作是行不通的,因为允许同一个线程两次进入同一个监视器而不会阻塞。

如果您确实锁定,那么是的,您应该在调用 Monitor.Enter(...) 的同一线程上调用 Monitor.Exit(...)。如果这是唯一的问题,您可以使用 this.BeginInvoke() 将其编组回 UI 线程。但就像我说的,在单线程场景中使用 Monitor 锁定是没有意义的。

于 2012-07-23T20:32:38.317 回答
0

不,您不想真正阻塞主线程。您想要做的是设置一个操作处于挂起状态的标志,并禁用取决于结果的 UI 部分。当从异步 WCF 操作返回结果时,您可以启用 UI 的这些部分并填充数据。

如果您阻塞主线程,它会显示应用程序已停止,这对您的用户来说将是一个糟糕的体验。

于 2012-07-23T20:23:48.770 回答