【问题标题】:Problems with IValueConverter and asynch DomainService Invoke in C#C# 中 IValueConverter 和异步 DomainService Invoke 的问题
【发布时间】:2012-06-08 10:14:37
【问题描述】:

在我的搜索中,这个问题的常见解决方案是在调用操作完成后添加一个事件处理程序来处理。

不幸的是,我的 IValueConverter 需要返回一个值,因此拥有处理程序并没有多大帮助。我还尝试了一个 do/while 循环,直到操作完成但循环永远不会关闭。

我也尝试了一个简单的等待操作,但它仍然返回 null。我知道我的 DomainService 返回正确的值,但 Converter 永远无法看到它。

在这种情况下我能做些什么吗?拥有一个可以工作的转换器将消除/减少我可以预见的几乎所有未来的问题。

我的代码:(我需要这样的东西)

    InspectDomainContext context = new InspectDomainContext();
    string name;
    InvokeOperation<string> inv;

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string id = (string)value;
        inv = context.GetName(id);
        inv.Completed += new EventHandler(inv_Completed);
        // return here after the handler has completed
        return name;
    }

    void inv_Completed(object sender, EventArgs e)
    {
        name = inv.Value;
    }

【问题讨论】:

    标签: c# asynchronous ivalueconverter domainservices


    【解决方案1】:

    (新答案,因为它与第一个完全不同!)

    这假定您正在使用某种 ViewModel 数据上下文模式...

    您可以在 ViewModel 上创建第二个属性来保存转换后的值,而不是在 IValueConverter 中执行此操作。

    public class MyViewModel
    {
        private string _id;
        public string Id
        {
            get { return _id; }
            set 
            { 
                _id = value; 
                UpdateConvertedName(_id);
            }
        }
    
        private void UpdateConvertedName(string id)
        {
            // Same as your 'Convert' code above
        }
    
        private void inv_Completed(object sender, EventArgs e)
        {
            Name = inv.Value;        
        } 
    
        public string Name { get; set; }
    }
    

    因此,您无需使用转换器绑定到 ID,而是直接绑定到 Name。每当更改 ID 时,名称都会异步更新。您可能还需要在 Name getter/setter 中添加一些 INotifyPropertyChanged,如果您使用的是 ViewModel,那么您已经熟悉了所有这些。

    由于您遇到了异步调用,因此还值得添加一些 UI 指示器来指示值是旧的或不完整的 - 我不知道您的设置是什么,但理论上客户端计算机可能在 28.8k 上来自世界另一端的连接或非常慢的移动设备,因此您的响应时间会很差。但这与手头的答案无关!

    【讨论】:

    • 哇,好答案!我没想过要使用 ViewModel,但这是有道理的。
    • 唷,我很高兴您使用的是 ViewModel,否则这将是两个垃圾答案!希望这可以帮助您获得所需的东西。
    【解决方案2】:

    您能改为同步调用它吗?

    return context.GetName(id.ToString());
    

    否则,您可能必须等待 .NET 4.5 和 async/await 关键字,据我了解(我自己还没有玩过它),这将让您在方法中的某处放置一个“等待”点而不是继续直到异步部分完成。

    但是没有办法让异步调用表现得像同步调用一样,正如您所要求的那样。为什么需要异步?

    【讨论】:

    • 它是实体的 LINQ,所以它是自动异步的.
    • 那是在使用 WCF RIA 服务吗?
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多