【问题标题】:HOW TO MAKE asynchonous call to WCF a synchonous one如何对 WCF 异步调用进行异步调用
【发布时间】:2011-03-02 05:44:20
【问题描述】:
public class AllViewModel 
{

    private List<Settings> SettingsList;

    public ViewAgendaAllViewModel()
    {
        client.SupplierListWithSettings(GetSupplierListWithSettings_Completed)
    }

    public void GetSupplierListWithSettings_Completed(object sender, Supplier_GetListWithSettingsCompletedEventArgs e)
    {

        if (e.Error == null)
        {
            if (e.Result != null)
            {
               SettingsList = new List<Settings>(); 
                foreach (VCareSupplierDto obj in e.Result)
                {
                    SettingsList.Add(obj);

                }
            }

        }
    }
}

问题:由于异步调用,未设置设置列表属性。

这是我的课程,我想同步调用 ServiceMethod SupplierListWithSettings。

当我创建 AllViewModel 的实例时,它应该加载设置。

预期:当我创建 AllViewModel 的实例时,它应该包含 SettingList 属性。

【问题讨论】:

    标签: c# wcf asynchronous


    【解决方案1】:

    更正:SettingsList 正在设置,但它听起来不像你想要的那样设置。

    听起来您要求这样做:当您构造 AllViewModel 的实例时,您希望在 AllViewModel 构造函数返回之前完全填充 SettingsList 属性。

    虽然可以做到这一点,但这可能不是一个好主意和可疑的设计要求有很多原因。将网络调用变为同步调用将阻塞调用线程(通常是您的 UI 线程),只要网络请求完成所需的时间,可能是 20 到 30 秒。您真的希望您的应用程序 UI 冻结 30 秒吗?您的用户可能会认为您的程序已经崩溃或“锁定”,并且会在没有意识到它还没有死的情况下关闭程序。

    尽管如此,操作方法如下:您可以使用 .NET 4.0 任务并行库 (TPL) 将异步调用转换为同步调用(未经测试):

    public AllViewModel()
    {
        var task = Task<List<Settings>>.Factory.StartNew(() =>
                         client.SupplierListWithSettings((s,e) => 
                         {
                             if (e.Error == null && e.Result != null)
                             {
                                 var list = new List<Settings>(); 
                                 foreach (VCareSupplierDto obj in e.Result)
                                 {
                                     list.Add(obj);
                                 }
                                 task.SetResult(list);
                             }
                         }));
        this.SettingsList = task.Result;
    }
    

    同样,这不是一个好主意。对于您来说,查看代码的哪些部分假设在构造对象后立即填充 SettingsList 属性并更改这些依赖项以执行诸如侦听 SettingsList 属性的更改并将其工作作为SettingsList 实际上是异步填充的。

    尝试使用异步流程而不是与之抗衡。

    【讨论】:

    • 我认为你应该强调一点,这是一个坏主意(冻结 UI 等)。是否有可能在 SettingsList 属性的 setter 方法中触发事件?
    • @froeschli:考虑到一半以上的文字专门强调这是一个坏主意,我认为我们已经涵盖了这一点。 ;> “侦听 SettingsList 属性的更改”通常通过触发事件来完成,特别是 IPropertyChangedNotification 规范。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2014-06-27
    相关资源
    最近更新 更多